Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从网站抓取温度传感器数据的动态更新_Python_Html_Url_Scrape - Fatal编程技术网

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

我编写了以下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>
温度传感器 当我使用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浏览器至少可以做四件事:

  • 连接到web服务器,获取数据
  • 解析HTML内容和CSS格式并显示网页
  • 解析Javascript内容并运行它
  • 为浏览器导航、HTML表单和Javascript程序的事件API等提供用户交互
  • 还是不确定?现在看看你的代码。BS4甚至不包括第一步,即获取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'