【发布时间】:2015-08-21 04:26:03
【问题描述】:
我正在尝试抓取 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 当我多次运行这个简单的脚本时,有时会收到“分段错误:11”。不知道为什么
【问题讨论】:
-
它对我有用,如果你的 python 是 3.x,你就缺少
()forprint -
@Michael:当您运行此代码时,它会连续打印 10 次“25”??我得到 14,12,25,15,15,17,17,15,14。
-
是的
2510 次。启动新的 python 解释器并再次运行您的代码以查看 -
您是在浏览器中查看它们,还是在使用 python?
-
@slaw 好吧,看起来它应该与
BeautifulSoup解析 HTML 的方式以及它在后台使用的底层解析器 (crummy.com/software/BeautifulSoup/bs4/doc/…) 有关。但我无法重现你所拥有的。我怀疑还有其他涉及,但尝试明确指定解析器,例如soup = BeautifulSoup(data, 'html5lib'),或soup = BeautifulSoup(data, 'lxml')。
标签: python beautifulsoup