我写了以下Python代码:
from bs4 import BeautifulSoup
import urllib2
url= 'http://www.example.com'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read(),"html.parser")
freq=soup.find('div', attrs={'id':'frequenz'})
print freq
结果是:
<div id="frequenz" style="font-size:500%; font-weight: bold; width: 100%; height: 10%; margin-top: 5px; text-align: center">tempsensor</div>
当我使用网络浏览器查看此网站时,网页显示动态内容,而不是字符串“tempsensor”。温度值每秒自动刷新。所以网页中的内容是
自动用数值替换字符串“tempsensor”。
我现在的问题是:如何让Python显示更新后的数值?如何获取自动更新的值tempsensor
在美丽汤?
抱歉,不,单独使用 BeautifulSoup 是不可能的。
问题在于 BS4 并不是一个完整的网络浏览器。它只是一个 HTML 解析器。它不解析 CSS,也不解析 Javascript。
一个完整的网络浏览器至少可以做四件事:
- 连接到网络服务器,获取数据
- 解析 HTML 内容和 CSS 格式并呈现网页
- 解析 Javascript 内容并运行它。
- 提供用户交互,如浏览器导航、HTML 表单和 JavaScript 程序的事件 API
还不确定吗?现在看看你的代码。 BS4 甚至不包括第一步,即获取网页,为此您必须使用urllib2
.
动态站点通常包含在浏览器上运行并定期更新内容的 Javascript。 BS4 不提供这一点,因此您不会看到它们,而且仅使用 BS4 也永远不会看到它们。为什么?由于上述第 (3) 项,下载并执行 Javascript 程序并未发生。它会发生在 IE、Firefox 或 Chrome 中,这就是为什么这些浏览器可以显示动态内容,而仅 BS4 的抓取则不会显示动态内容。
PhantomJS http://phantomjs.org/ and CasperJS http://casperjs.org/提供更机械化的浏览器,通常可以运行支持动态网站的 JavaScript 代码。但 CasperJS 和 PhantomJS 是用服务器端 Javascript 编程的,而不是 Python。
显然,有些人使用 PyQt4 内置的浏览器来执行此类动态屏幕截图任务 https://stackoverflow.com/questions/22028775/tried-python-beautifulsoup-and-phantom-js-still-cant-scrape-websites,隔离部分 DOM,并将其发送到 BS4 进行解析。这可能会提供 Python 解决方案。
在评论中,@Cyphase 建议您想要的确切数据可能在不同的 URL 上可用,在这种情况下,可能会使用 urllib2/BS4 获取并解析它。这可以通过仔细检查站点上运行的 Javascript 来确定,特别是您可以查找setTimeout
and setInterval
安排更新,或者ajax
,或 jQuery 的.load
从后端获取数据的函数。用于更新动态内容的 JavaScript 将usually仅从同一网站的后端 URL 获取数据。如果他们使用 jQuery$('#frequenz')
指的是div,在JS中搜索this可能会找到更新div的代码。如果没有 jQuery,JS 更新可能会使用document.getElementById('frequenz')
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)