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 本身使用libxml2
和libxslt
这也可能是罪魁祸首。您可能还需要升级那些。见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 找到的链接的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫编程思想(55):Beautiful Soup方法选择器之find_all方法