我正在试图抓住nature.com对期刊文章进行一些分析。当我执行以下操作时:
import requests
from bs4 import BeautifulSoup
import re
query = "http://www.nature.com/search?journal=nature&order=date_desc"
for page in range (1, 10):
req = requests.get(query + "&page=" + str(page))
soup = BeautifulSoup(req.text)
cards = soup.findAll("li", "mb20 card cleared")
matches = re.findall('mb20 card cleared', req.text)
print(len(cards), len(matches))
我希望Beautifulsoup打印“25”(搜索结果的数量)10次(每页一次),但事实并非如此。相反,它打印:
14, 25
12, 25
25, 25
15, 25
15, 25
17, 25
17, 25
15, 25
14, 25
查看html源代码显示每页应该返回25个结果,但是Beautifulsoup似乎在这里混淆了,我无法弄清楚原因。
更新1 如果重要,我使用Anaconda Python 2.7.10和bs4版本4.3.1在Mac OSX Mavericks上运行
更新2 我添加了一个正则表达式,表明req.text确实包含了我正在寻找的东西,但是beautifulsoup没有找到它
更新3 当我多次运行这个简单的脚本时,我有时会得到“Segmentation fault:11”。不确定为什么
答案 0 :(得分:1)
differences之间有parsers used by BeautifulSoup
under-the-hood。
如果您未明确指定解析器,BeautifulSoup
将choose the one based on rank:
如果您没有指定任何内容,您将获得最佳的HTML解析器 安装。然后,Beautiful Soup将lxml的解析器列为最佳解析器 html5lib,然后是Python的内置解析器。
明确指定解析器:
soup = BeautifulSoup(data, 'html5lib')
soup = BeautifulSoup(data, 'html.parser')
soup = BeautifulSoup(data, 'lxml')