Beautiful Soup 找不到我想要的 HTML 部分
Posted
技术标签:
【中文标题】Beautiful Soup 找不到我想要的 HTML 部分【英文标题】:Beautiful Soup can't find the part of the HTML I want 【发布时间】:2019-01-29 15:55:51 【问题描述】:我使用 BeautifulSoup 进行网页抓取已经有一段时间了,这是我第一次遇到这样的问题。我试图在代码中选择数字 101,172,但即使我使用 .find 或 .select,输出始终只是标签,而不是数字。我以前做过类似的数据收集工作,没有遇到任何问题
<div class="legend-block legend-block--pageviews">
<h5>Pageviews</h5><hr>
<div class="legend-block--body">
<div class="linear-legend--counts">
Pageviews:
<span class="pull-right">
101,172
</span>
</div>
<div class="linear-legend--counts">
Daily average:
<span class="pull-right">
4,818
</span>
</div></div></div>
我用过:
res = requests.get(wiki_page, timeout =None)
soup = bs4.BeautifulSoup(res.text, 'html.parser')
ab=soup.select('span[class="pull-right"]')
#print(i)
print(ab)
输出:
[<span class="pull-right">\n<label class="logarithmic-scale">\n<input
class="logarithmic-scale-option" type="checkbox"/>\n Logarithmic scale
</label>\n</span>, <span class="pull-right">\n<label class="begin-at-
zero">\n<input class="begin-at-zero-option" type="checkbox"/>\n Begin at
zero </label>\n</span>, <span class="pull-right">\n<label class="show-
labels">\n<input class="show-labels-option" type="checkbox"/>\n Show
values </label>\n</span>]
另外,我要找的数据号是动态的,所以我不确定javascript是否会影响BeautifulSoup
【问题讨论】:
那么,您是如何尝试获得价值的?我们至少需要一个 sn-p 来检查您的代码中可能出现的问题。 奇怪,如果您将 html sn-p 通过 BeautifulSoup 然后为 span 执行 find_all 并在返回时应用 .text 您将获得 101,172.. Dynamic Data Web Scraping with Python, BeautifulSoup的可能重复 【参考方案1】:试试这个:
from bs4 import BeautifulSoup as bs
html='''<div class="legend-block legend-block--pageviews">
<h5>Pageviews</h5><hr>
<div class="legend-block--body">
<div class="linear-legend--counts">
Pageviews:
<span class="pull-right">101,172
</span>
</div>
<div class="linear-legend--counts">
Daily average:
<span class="pull-right">
4,818
</span>
</div></div></div>'''
soup = bs(html, 'html.parser')
div = soup.find("div", "class": "linear-legend--counts")
span = div.find('span')
text = span.get_text()
print(text)
输出:
101,172
只需一行:
soup = bs(html, 'html.parser')
result = soup.find("div", "class": "linear-legend--counts").find('span').get_text()
编辑:
由于 OP 发布了另一个可能与此问题重复的问题,因此他找到了答案。对于正在寻找类似问题答案的人,我将发布该问题的已接受答案。可以找到here。
如果您使用 requests.get 检索页面,javascript 代码将不会被执行。所以要用硒代替。它将模仿用户在浏览器中打开页面的行为,因此将执行js代码。
要开始使用 selenium,您需要使用 pip install selenium
进行安装。然后在下面检索您的项目使用代码:
from selenium import webdriver
browser = webdriver.Firefox()
# List of the page url and selector of element to retrieve.
wiki_pages = [("https://tools.wmflabs.org/pageviews/?project=en.wikipedia.org&platform=all-access&agent=user&range=latest-20&pages=Star_Wars:_The_Last_Jedi",
".summary-column--container .legend-block--pageviews .linear-legend--counts:first-child span.pull-right"),]
for wiki_page in wiki_pages:
url = wiki_page[0]
selector = wiki_page[1]
browser.get(wiki_page)
page_views_count = browser.find_element_by_css_selector(selector)
print page_views_count.text
browser.quit()
注意:如果您需要运行无头浏览器,请考虑使用PyVirtualDisplay(Xvfb 的包装器)运行无头 WebDriver 测试,请参阅“How do I run Selenium in Xvfb?”了解更多信息。
【讨论】:
我必须对许多页面执行此过程,因此我选择带有 soup.select('html') 的整个 html 标记并将其与变量 html 相等,并且该过程与您的相同。但是,在变量 html 中,我仍然无法获取值。可能是因为它是根据页面变化的动态数据? 给我一个示例网址 tools.wmflabs.org/pageviews/… 浏览量是我想要的以上是关于Beautiful Soup 找不到我想要的 HTML 部分的主要内容,如果未能解决你的问题,请参考以下文章
如果对象也有其他类,Beautiful Soup 也找不到 CSS 类
Beautiful Stone Soup 在 XML 标记名称上区分大小写