我正在使用 BeautifulSoup 4 来抓取一个网站并生成一个像魅力一样工作的脚本。但是当我更换电脑并在另一台上尝试脚本时,它突然开始发出错误。错误的原因是我使用了css搜索,这是BS的新功能,对最新版本有效。具体搜索是这样的:
soup.findAll(class_="class-name")
“类名”存在于网页中,我确信它正在工作。问题是,新计算机在解析网页时有些失败,并且无法检测到任何名为“class-name”的类。如您所料,上面的搜索返回一个空列表。
我安装了html5lib
and lxml
,同时单独安装:没有任何改变。我确保 BS在两种不同lxml
的html5lib
情况下使用以下几行进行解析:
page = urllib2.urlopen("url")
soup = BeautifulSoup(page.read(),"html5lib")
或者
soup = BeautifulSoup(page.read(),"lxml")
什么都没有再次改变。搜索返回一个空列表。请帮助我。顺便说一句,我正在寻找一个中肯的答案,只是帮助我让 BS 创建一个正确的解析。请尽量不要提供需要我在脚本中进行大量更改的建议。正如我之前所说,它正在工作。
提前致谢。
根据评论,我包括一个简短的失败示例。顺便说一句,除了 python 之外,两台计算机中所有内容的版本都是相同的。运行脚本的计算机有 pyhton 2.6,另一台有 2.7。但我不认为这是原因。
from bs4 import BeautifulSoup
import urllib2
page = urllib2.urlopen("www.website.com/some extensions...")
soup = BeautifulSoup(page.read())
#Now I need information that is included in a class called any_class. The info's
#html tag is 'i' and I want to extract the text in that tag, for the first appearance
#of any_class on the page
text = soup.findAll(class_="any_class")[0].i.text
现在我导航到命令行并运行脚本。
$ ./crawler.py
#Index Error! List out of Index!
我希望现在一切都清楚了。如您所见,soup.findAll 为“any_class”的类搜索返回一个空列表。BS显然找不到页面上几乎找不到的“any_class”。我坚信这个问题是一个解析器问题。我猜python坚持使用它的默认“html.parser”而不是我安装的lxml和html5lib。您还可以在您的答案中包含一个简短指南,说明我应该如何向 python 声明我想用 lxml 或 html5lib 为 BS 解析。