我写了以下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显示更新的数值?如何在BeautifulSoup中获取tempsensor
的自动更新值?
答案 0 :(得分:2)
问题是BS4不是一个完整的Web浏览器。它只是一个HTML解析器。它不解析CSS,也不解析Javascript。
完整的网络浏览器至少可以做四件事:
还不确定?现在看看你的代码。 BS4甚至不包括获取网页的第一步,要做到必须使用urllib2
。
动态网站通常包含在浏览器上运行的Javascript并定期更新内容。 BS4没有提供,所以你不会看到它们,而且永远不会只使用BS4。为什么?因为上面的第(3)项,所以没有发生下载和执行Javascript程序。它会在IE,Firefox或Chrome中肆虐,这就是为什么那些能够显示动态内容的原因,而仅有BS4的抓取功能却没有显示出来。
PhantomJS和CasperJS提供了一个更加机械化的浏览器,通常可以运行支持动态网站的JavaScript代码。但CasperJS和PhantomJS是用服务器端Javascript编程的,而不是Python。
显然,有些人是using a browser built into PyQt4 for these kinds of dynamic screenscaping tasks,隔离了部分DOM,并将其发送到BS4进行解析。这可能允许Python解决方案。
在评论中,@ Cyphase建议您可能在不同的URL上提供您想要的确切数据,在这种情况下,可能会使用urllib2 / BS4获取和解析它。这可以通过仔细检查网站上运行的Javascript来确定,尤其是您可以查找安排更新的setTimeout
和setInterval
,或ajax
或jQuery&#39; s .load
函数用于从后端获取数据。用于动态内容更新的Javascripts 通常仅从同一网站的后端URL获取数据。如果他们使用jQuery $('#frequenz')
引用div,并且通过在JS中搜索它,您可能会找到更新div的代码。如果没有jQuery,JS更新可能会使用document.getElementById('frequenz')
。
答案 1 :(得分:-2)
这应该这样做:
freq.text.strip()
在
中>>> html = '<div id="frequenz" style="font-size:500%; font-weight: bold; width: 100%; height: 10%; margin-top: 5px; text-align: center">tempsensor</div>'
>>> soup = BeautifulSoup(html)
>>> soup.text.strip()
u'tempsensor'