Python:在BeautifulSoup中找到在一台Windows机器上正常工作,而在另一台Windows机器上则不正



我在Windows 7机器上运行了Python 2.7中的简单代码:

from urllib2 import urlopen
from bs4 import BeautifulSoup
from HTMLParser import HTMLParser
def main():
html_parser = HTMLParser()
soup = BeautifulSoup(urlopen("http://www.amazon.com/gp/bestsellers/").read())
categories = []
for category_li in soup.find(attrs={'id':'zg_browseRoot'}).find('ul').findAll('li'):
category = {}
category['name'] = html_parser.unescape(category_li.a.string)
category['url'] = category_li.a['href']
categories.append(category) 

当我在一台机器上运行它时,它工作正常,当我在另一台机器上运行它时,我收到以下错误消息:

Traceback (most recent call last):
File ".../tmp.py", line 10, in <module>
for category_li in soup.find(attrs={'id':'zg_browseRoot'}).find('ul').findAll('li'):
AttributeError: 'NoneType' object has no attribute 'find'

谁能帮我找出原因?两台机器都安装了Python 2.7。 我真的很感激任何帮助。

在两台不同的机器上运行代码之间的不同输出是用于解析 html 的解析器。在不起作用的机器上安装了 lxml,所以 bs4 正在使用它,在正常工作的机器上,您使用了我们html.parser我们使用诊断代码发现的。

运行诊断代码会显示系统上可用的解析器以及它们如何解析 html:

from bs4.diagnose import diagnose
data = urlopen("http://www.amazon.com/gp/bestsellers/").read()
diagnose(data)

因此,将已安装lxml系统上的代码更改为:

soup = BeautifulSoup(urlopen("http://www.amazon.com/gp/bestsellers/").read(),"html.par‌​ser")

将解析器更改为html.par‌​ser就可以解决问题。

有趣的是,我可以使用相同的 bs44.3.2版本在 ubuntu 上使用任一解析器运行代码,唯一的区别是我的lxml版本3.4.1.0 vs 3.4.4.0稍旧。

相关内容

最新更新