Python 如何从某一行开始刮取HTML文件中的数据

Python 如何从某一行开始刮取HTML文件中的数据,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我正试图从HTML文件中提取数据。看起来是这样的: from bs4 import BeautifulSoup as bs import urllib redditPage1 = "http://redditlist.com/sfw" r=urllib.urlopen(redditPage1).read() soup = bs(r) 现在我想按订阅人数的顺序将reddit版主(或者称为SubRedditor)列在一个列表中。为此,我只需查看这行代码后面的数据: <h3 class="li

我正试图从HTML文件中提取数据。看起来是这样的:

from bs4 import BeautifulSoup as bs
import urllib
redditPage1 = "http://redditlist.com/sfw"
r=urllib.urlopen(redditPage1).read()
soup = bs(r)
现在我想按订阅人数的顺序将reddit版主(或者称为SubRedditor)列在一个列表中。为此,我只需查看这行代码后面的数据:

<h3 class="listing-header">Subscribers</h3>
订阅者
这一行之前的所有内容都是不相关的,这一行之后关于子编辑器的所有条目如下所示:

<div class="listing-item" data-target-filter="sfw" data-target-subreddit="funny">
<div class="offset-anchor" id="funny-subscribers"></div>
<span class="rank-value">1</span>
<span class="subreddit-info-panel-toggle sfw"> <div>i</div> </span>
<span class="subreddit-url">
<a class="sfw" href="http://reddit.com/r/funny" target="_blank">funny</a>
</span>
<span class="listing-stat">18,197,786</span>
</div>

1.
我
18,197,786
我应该怎么做才能提取出在这一行之后而不是之前的子编辑器名称?

尝试查找
订阅者
,然后获取父
div
,范围将限于
订阅者
div。然后查找类为
列表项
的所有div,循环它们以获取文本(名称)内部元件的编号

试试这个:

for div in soup.select('.span4.listing'):
    if div.h3.text.lower()=='subscribers':
        output = [(ss.select('a.sfw')[0].text, ss.select('.listing-stat')[0].text) for ss in div.select('.listing-item')]

为了获得期望的结果,使代码更具可读性,您也可以这样做

import requests
from lxml.html import fromstring

res = requests.get("http://redditlist.com/sfw").text
root = fromstring(res)
for container in root.cssselect(".listing"):
    if container.cssselect("h3:contains('Subscribers')"):
        for subreddit in container.cssselect(".listing-item"):
            print(subreddit.attrib['data-target-subreddit'])
或者使用
BeautifulSoup
,如果您愿意:

import requests
from bs4 import BeautifulSoup

main_link = "http://redditlist.com/all?page={}"
for link in [main_link.format(page) for page in range(1,5)]:
    res = requests.get(link).text
    soup = BeautifulSoup(res,"lxml")
    for container in soup.select(".listing"):
        if container.select("h3")[0].text=="Subscribers":
            for subreddit in container.select(".listing-item"):
                print(subreddit['data-target-subreddit'])

哦,还有一个问题。比如说,我不仅要读redditpage1,还要读redditpage2和redditpage3。用一碗汤就可以做到吗?或者我应该循环浏览每一页吗?你需要循环浏览每一页(
http://redditlist.com/sfw?page=2
)传递页码。您的代码将打印html文件中的所有
数据目标子Reddit
文本,而我只对该文件中
订阅者之后的文本感兴趣。我不知道你的回答对我有什么帮助。我的错!!我没听到那句话。将很快更新答案。现在,查看它。嗯,很有趣。我正在学习beautifulsoup,所以我更喜欢利用它的解决方案。但你的解决方案似乎同样有效!感谢您的选择。还添加了使用
BeautifulSoup
的编码。我觉得很有趣,这就是我为什么这么做的原因。谢谢。谢谢!这似乎也行得通。但是当我打印文本列表时,它看起来像这样
u'text'
。为什么那里有一个
u
,我怎样才能摆脱它?
import requests
from bs4 import BeautifulSoup

main_link = "http://redditlist.com/all?page={}"
for link in [main_link.format(page) for page in range(1,5)]:
    res = requests.get(link).text
    soup = BeautifulSoup(res,"lxml")
    for container in soup.select(".listing"):
        if container.select("h3")[0].text=="Subscribers":
            for subreddit in container.select(".listing-item"):
                print(subreddit['data-target-subreddit'])