从websi中获取温度传感器数据的动态更新

2024-10-03 23:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了以下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

结果是:

^{pr2}$

当我使用web浏览器查看此站点时,web页面显示的是动态内容,而不是字符串“tempsensor”。温度值每秒自动刷新。所以网页上有些东西 将字符串“tempsensor”自动替换为数值。在

我现在的问题是:如何让Python显示更新后的数值?如何获得beautifulGroup中自动更新到tempsensor的值?在


Tags: 字符串代码fromimportwebhttpurlpage
3条回答

你少了一点代码:

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.string  # Added .string

抱歉,不,单靠BeautifulSoup是不可能的

问题是BS4不是一个完整的web浏览器。它只是一个HTML解析器。它不解析CSS,也不解析Javascript。在

一个完整的web浏览器至少要做四件事:

  1. 连接到web服务器,获取数据
  2. 解析HTML内容和CSS格式并显示网页
  3. 解析Javascript内容并运行它。在
  4. 为浏览器导航、HTML表单和Javascript程序的事件API等提供用户交互

还是不确定?现在看看你的代码。BS4甚至没有包括第一步,即获取web页面,要做到这一点,您必须使用urllib2。在

动态网站通常包括运行在浏览器上的Javascript,并定期更新内容。BS4不提供这些,因此您不会看到它们,而且仅使用BS4也不会看到它们。为什么?因为上面第(3)项,所以不会下载和执行Javascript程序。在IE、Firefox或Chrome中都会出现这种情况,这就是为什么这些工具只能显示动态内容,而只有BS4的抓取不能显示动态内容。在

PhantomJSCasperJS提供了一个更加机械化的浏览器,通常可以运行支持动态网站的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和{},或者{},或者jQuery的.load函数从后端获取数据。用于动态内容更新的Javascripts通常只从同一网站的后端url获取数据。如果他们使用jQuery,$('#frequenz')引用div,通过在JS中搜索,您可能会找到更新div的代码。没有jQuery,JS更新可能会使用document.getElementById('frequenz')。在

这应该做到:

freq.text.strip()

^{pr2}$

相关问题 更多 >