Python:在 BeautifulSoup 中查找在一台 windows 机器上正常工作,但在另一台机器上不正确
Python: find in BeautifulSoup works correctly on one windows machine and not correct on another
我在 Python 2.7 运行ning Windows 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.parser")
将解析器更改为 html.parser
成功了。
有趣的是,我可以 运行 使用相同版本的 bs4 4.3.2
在 ubuntu 上使用任一解析器的代码,唯一的区别是我的 lxml
版本稍旧3.4.1.0 vs 3.4.4.0
。
我在 Python 2.7 运行ning Windows 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.parser")
将解析器更改为 html.parser
成功了。
有趣的是,我可以 运行 使用相同版本的 bs4 4.3.2
在 ubuntu 上使用任一解析器的代码,唯一的区别是我的 lxml
版本稍旧3.4.1.0 vs 3.4.4.0
。