【问题标题】:Beautifulsoup Cannot FindAllBeautifulsoup 找不到所有
【发布时间】: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,你就缺少 () for print
  • @Michael:当您运行此代码时,它会连续打印 10 次“25”??我得到 14,12,25,15,15,17,17,15,14。
  • 是的25 10 次。启动新的 python 解释器并再次运行您的代码以查看
  • 您是在浏览器中查看它们,还是在使用 python?
  • @slaw 好吧,看起来它应该与 BeautifulSoup 解析 HTML 的方式以及它在后台使用的底层解析器 (crummy.com/software/BeautifulSoup/bs4/doc/…) 有关。但我无法重现你所拥有的。我怀疑还有其他涉及,但尝试明确指定解析器,例如soup = BeautifulSoup(data, 'html5lib'),或soup = BeautifulSoup(data, 'lxml')

标签: python beautifulsoup


【解决方案1】:

parsers used by BeautifulSoup under-the-hood之间有differences

如果您没有明确指定解析器,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')

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2016-05-27
    • 2018-03-28
    • 2015-02-05
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多