从网站

时间:2015-08-15 20:01:14

标签: 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="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的自动更新值?

2 个答案:

答案 0 :(得分:2)

对不起,单独使用BeautifulSoup是不可能的。

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

完整的网络浏览器至少可以做四件事:

  1. 连接到Web服务器,提取数据
  2. 解析HTML内容和CSS格式并显示网页
  3. 解析Javascript内容,运行它。
  4. 为浏览器导航,HTML表单和Javascript程序的事件API提供用户交互
  5. 还不确定?现在看看你的代码。 BS4甚至不包括获取网页的第一步,要做到必须使用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来确定,尤其是您可以查找安排更新的setTimeoutsetInterval,或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'