Python 从网站抓取温度传感器数据的动态更新
我编写了以下python代码:Python 从网站抓取温度传感器数据的动态更新,python,html,url,scrape,Python,Html,Url,Scrape,我编写了以下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="freque
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>
温度传感器
当我使用web浏览器查看此网站时,网页显示的是动态内容,而不是字符串“tempsensor”。温度值每秒自动刷新一次。因此,网页中的某些内容是
自动将字符串“tempsensor”替换为数值
我现在的问题是:如何让Python显示更新后的数值?如何获得BeautifulSoup中tempsensor自动更新的值?您缺少一点代码:
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
这应该做到:
freq.text.strip()
如
html='tempsensor'
>>>soup=BeautifulSoup(html)
>>>soup.text.strip()
温度传感器
很抱歉,不能单独使用BeautifulSoup。
问题在于BS4不是一个完整的web浏览器。它只是一个HTML解析器。它不解析CSS,也不解析Javascript
一个完整的web浏览器至少可以做四件事:
urlib2
动态站点通常包含Javascript,以便在浏览器上运行并定期更新内容。BS4不提供这一点,因此您不会看到它们,而且只使用BS4也永远不会看到它们。为什么?由于上面第(3)项的原因,无法下载和执行Javascript程序。这将发生在IE、Firefox或Chrome中,这就是为什么这些工具可以显示动态内容,而BS4只能抓取不显示
并提供一个更机械化的浏览器,通常可以运行支持动态网站的JavaScript代码。但是CasperJS和PhantomJS是用服务器端Javascript而不是Python编程的
显然,有些人正在隔离DOM的一部分,并将其发送到BS4进行解析。这可能需要Python解决方案
在注释中,@Cyphase表示您想要的确切数据可能在不同的URL上可用,在这种情况下,可以使用urllib2/BS4获取和解析数据。这可以通过仔细检查站点上运行的Javascript来确定,特别是您可以查找计划更新的
setTimeout
和setInterval
,或者ajax
,或者jQuery的.load
函数来从后端获取数据。用于动态内容更新的Java脚本通常只从同一网站的后端URL获取数据。如果他们使用jQuery$('#frequenz')
引用div,通过在JS中搜索它,您可以找到更新div的代码。没有jQuery,JS更新可能会使用document.getElementById('frequenz')
“如何通过python计算变量tempsensor的值?”-我没有看到任何变量…实际url是什么?实际url是啊,我知道了。您想要的值正在由JavaScript更新。你不能仅仅解析HTML。你需要弄清楚API。看起来你只是请求http://www.netzfrequenz.info/json/aktuell2.json?_=
。例如,.freq.string只提供变量的字符串(名称),而不提供值。在这种情况下,温度值每秒更新一次。tempsensor只是变量的名称。啊,我觉得你的问题措辞很奇怪。但你在说什么价值呢?我在任何地方都看不到值。噢,你是说你的程序中有一个名为tempsensor
的变量吗?如果是这样,你能把它放在一个目录中吗?如果是这样,您可以执行打印变量\u dict[freq.string]
。让我知道这是否对你有效;如果有,我将更新答案。是的,html代码包含此变量,我想用python获取值。@ChrisWeber,tempsensor
中的值在哪里?
>>> 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'