Python Beauty Soup 4 find_都没有找到Beauty Soup 3找到的链接

Python Beauty Soup 4 find_都没有找到Beauty Soup 3找到的链接,python,web,web-scraping,beautifulsoup,Python,Web,Web Scraping,Beautifulsoup,我注意到一个非常恼人的错误: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.Beauti

我注意到一个非常恼人的错误: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'
您已经安装了lxml,这意味着Beautifulsoup4将在标准库html.parser选项上使用该解析器

您可以将lxml升级到3.2.1,对我来说,它会为您的测试页面返回1701个结果;lxml本身使用libxml2和libxslt,这在这里可能也是罪魁祸首。您可能还需要升级它们。看,;目前建议使用libxml2.7.8或更新版本

或者在解析soup时显式指定另一个解析器:

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

我两个都得到1701分。也许可以尝试使用find_all for s4,因为它应该用于bs4BS4。bs4使用可插入的解析器,如果安装了,将切换到“更好”的解析器。例如,如果您安装了lxml,结果可能会有所不同。使用BS4的名称来了解为什么您看到的结果如此之少。@Haidro:.findAll是.find_all;两种方式都运行相同的代码。@halflings:从BS 4.2.0升级到4.2.1。现在html5lib也给了我1701,但仍然无法重现您的问题。在BS4.2.1、4.2.0、4.1.3和3.2.1上,无论有无html5lib,无需重新编程-所有1701不幸的是,升级lxml都没有帮助。而且,我找不到带有pip的libxml2和libxslt:根本找不到libxml2的发行版;谢谢你的回答@半身人:libxml2不是python库,它是lxml使用的C库。pip将无法升级它:-PI拥有Ubuntu repos上的最新版本:2.9.0有趣;有可能是2.9.0在这里破坏了一些东西。哇,这一个实际上仍在工作。试试看,thebalitimes.com无法通过libxml获得它