所以我几个小时前就开始编程,从Nathan Yau的Visualize This开始做一个例子。我正在使用Python 3.3.4和BeautifulSoup4进行我的第一次数据刮擦练习。虽然这本书似乎使用的是Python 2.x,但我已经设法找出更新的代码,使用来自wunderground.com的历史数据完成我的第一次数据抓取练习:
>>> maxTemp = soup.findAll(attrs={"class":"nobr"})[5].span.string
>>> print(maxTemp)
结果应该是“37”。
我在第一个脚本中包含了这段代码,当我尝试从命令提示符运行它时,它会启动,但后来我收到错误:
"AttributeError: 'NoneType' object has no attribute 'string'"
您可以想象,看到我的代码在Python IDLE GUI中运行良好而不是从脚本运行是令人沮丧的。我环顾四周寻找答案,并尝试了不同的东西,但我现在肯定陷入困境。有什么建议吗?
编辑:为我的示例添加更多代码。这是来自失败的脚本:
url = "http://www.wunderground.com/history/airport/KBOS/2013/" + str(m) + "/" + str(d) + "DailyHistory.html"
page = urllib.request.urlopen(url)
# Get daily maximum temperature from page
soup = BeautifulSoup(page)
# maxTemp = soup.body.nobr.b.string
maxTemp = soup.findAll(attrs={"class":"nobr"})[5].span.string
同样,当我从终端运行它时,它失败了:
C:\Python33>python get-weather-data.py
Getting data for 201311
Traceback (most recent call last)
File "get-weather-data.py", line 28, in (module)
maxTemp = soup.findAll(attrs={"class":"nobr"})[5].span.string
AttributeError: 'NoneType' object has no attribute 'string'
即使它在IDLE中工作正常:
import urllib.request
page = urllib.request.urlopen("http://www.wunderground.com/history/airport/KBOS/2013/1/1/DailyHistory.html")
from bs4 import BeautifulSoup
soup = BeautifulSoup(page)
maxTemp = soup.findAll(attrs={"class":"nobr"})[5].span.string
print(maxTemp)
答案 0 :(得分:1)
我有同样的问题。这是一本了不起的书,但似乎这个例子是基于之前版本的Beautiful Soup。如果你放弃" .span"它会起作用。部分。像这样:
maxTemp = soup.findAll(attrs={"class":"nobr"})[5].string
答案 1 :(得分:0)
您可以尝试阅读网页,将内容转储到文件,并比较IDLE与脚本方案的文件内容。可能是页面内容实际上是不同的 - 您看到的差异可能是正确的。这样做有助于缩小可能的原因。