Beautiful Soup 4 find_all 找不到 Beautiful Soup 3 找到的链接

Posted

技术标签:

【中文标题】Beautiful Soup 4 find_all 找不到 Beautiful Soup 3 找到的链接【英文标题】:Beautiful Soup 4 find_all don't find links that Beautiful Soup 3 finds 【发布时间】:2013-07-15 22:47:51 【问题描述】:

我注意到一个非常烦人的错误:BeautifulSoup4(包:bs4)通常比以前的版本(包:BeautifulSoup)找到更少的标签。

这是该问题的可复制实例:

import requests
import bs4
import BeautifulSoup

r = requests.get('http://wordpress.org/download/release-archive/')
s4 = bs4.BeautifulSoup(r.text)
s3 = BeautifulSoup.BeautifulSoup(r.text)

print 'With BeautifulSoup 4 : '.format(len(s4.findAll('a')))
print 'With BeautifulSoup 3 : '.format(len(s3.findAll('a')))

输出:

With BeautifulSoup 4 : 557
With BeautifulSoup 3 : 1701

如您所见,差异并不小。

如果有人想知道,以下是模块的确切版本:

In [20]: bs4.__version__
Out[20]: '4.2.1'

In [21]: BeautifulSoup.__version__
Out[21]: '3.2.1'

【问题讨论】:

我都得到了1701。也许尝试将find_all 用于s4,因为它应该用于bs4 BS4 使用可插入的解析器,如果安装了它会切换到“更好”的解析器。例如,如果您安装了lxml,结果可能会大不相同。使用 BS4 的 diagnose() utility 了解为什么您看到的结果如此之少。 @Haidro: .findAll().find_all() 的别名; 相同的代码以任一方式运行。 @halflings:从 BS 4.2.0 升级到 4.2.1。现在html5lib 也给了我 1701,但仍然无法重现您的问题。 在 BS 4.2.1、4.2.0、4.1.3 和 3.2.1 上使用和不使用 html5lib - 所有 1701 【参考方案1】:

您已安装 lxml,这意味着 BeautifulSoup 4 将使用 那个 解析器而不是标准库 html.parser 选项。

您可以将 lxml 升级到 3.2.1(对我来说,它会为您的测试页面返回 1701 个结果); lxml 本身使用libxml2libxslt 这也可能是罪魁祸首。您可能还需要升级那些。见lxml requirements page;目前推荐使用 libxml2 2.7.8 或更高版本。

或者在解析soup时显式指定其他解析器:

s4 = bs4.BeautifulSoup(r.text, 'html.parser')

【讨论】:

不幸的是,升级 lxml 没有帮助。另外,我找不到带有 pip:No distributions at all found for libxml2 的 libxml2 和 libxslt ;感谢您的回答! @halflings: libxml2 不是 python 库,它是 lxml 使用的 C 库。 pip 将无法升级它。 :-P 我有 Ubuntu 存储库中的最新版本:2.9.0 有趣; 2.9.0 有可能在这里破坏了一些东西。 哇这个居然还在工作尝试 thebalitimes.com 无法通过 libxml 得到它

以上是关于Beautiful Soup 4 find_all 找不到 Beautiful Soup 3 找到的链接的主要内容,如果未能解决你的问题,请参考以下文章

Beautiful Soup中的find,find_all

Python爬虫编程思想(55):Beautiful Soup方法选择器之find_all方法

Python爬虫编程思想(56):Beautiful Soup方法选择器之find方法

使用 Beautiful Soup 查找特定类

使用beautiful soup解析xml

Beautiful Soup findAll 没有找到它们