FeatureNotfound: 找不到具有您所要求的特性的树生成器: lxml。是否需要安装解析器库?

...
soup = BeautifulSoup(html, "lxml")
File "/Library/Python/2.7/site-packages/bs4/__init__.py", line 152, in __init__
% ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?

以上输出在我的终端。我在 Mac OS 10.7.x 上。我使用了 Python 2.7.1,并遵循 本教程获得了 Beautiful Soup 和 lxml,它们都成功地安装并使用单独的测试文件 位于这里。在导致这个错误的 Python 脚本中,我包含了这一行: from pageCrawler import comparePages 在 pageCrawler 文件中,我包含了以下两行: from bs4 import BeautifulSoup from urllib2 import urlopen

如能帮助我们找出问题所在以及如何解决这个问题,我们将不胜感激。

590812 次浏览

我怀疑这与BS将用于读取HTML的解析器有关。他们文档在这里,但如果你像我一样(在OSX上),你可能会被一些需要一点工作的东西困住:

您会注意到,在上面的BS4文档页面中,他们指出BS4默认将使用Python内置HTML解析器。假设你使用的是OSX, Python的apple捆绑版本是2.7.2,它对字符格式化并不宽容。我遇到了同样的问题,所以我升级了我的Python版本来解决它。在virtualenv中这样做可以最大限度地减少对其他项目的干扰。

如果这样做听起来很痛苦,你可以切换到LXML解析器:

pip install lxml

然后试试:

soup = BeautifulSoup(html, "lxml")

根据您的情况,这可能已经足够好了。我觉得这很烦人,所以升级了我的Python版本。使用virtualenv, 您可以迁移您的包相当容易。

对于安装了bs4的基本开箱即用的python,您可以使用

soup = BeautifulSoup(html, "html5lib")

然而,如果你想使用格式化程序=“xml”,那么你需要

pip3 install lxml


soup = BeautifulSoup(html, features="xml")

我也遇到过同样的问题。我发现原因是我有一个稍微过时的python 6包。

>>> import html5lib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/html5lib/__init__.py", line 16, in <module>
from .html5parser import HTMLParser, parse, parseFragment
File "/usr/local/lib/python2.7/site-packages/html5lib/html5parser.py", line 2, in <module>
from six import with_metaclass, viewkeys, PY3
ImportError: cannot import name viewkeys

升级你的六个软件包将解决这个问题:

sudo pip install six=1.10.0

我更喜欢内置的python html解析器,没有安装没有依赖

soup = BeautifulSoup(s, "html.parser")

我正在使用Python 3.6,在这篇文章中我有相同的原始错误。在我运行命令后:

python3 -m pip install lxml

它解决了我的问题

不要使用lxml,而是使用html。解析器,你可以使用这段代码:

soup = BeautifulSoup(html, 'html.parser')
虽然BeautifulSoup默认支持HTML解析器 如果你想使用任何其他第三方Python解析器,你需要安装外部解析器,如(lxml).

soup_object= BeautifulSoup(markup, "html.parser") #Python HTML parser

但是如果你没有指定任何解析器作为参数,你会得到一个没有指定解析器的警告。

soup_object= BeautifulSoup(markup) #Warnning

要使用任何其他外部解析器,您需要安装它,然后需要指定它。就像

pip install lxml


soup_object= BeautifulSoup(markup, 'lxml') # C dependent parser

外部解析器依赖于c和python,这可能有一些优点和缺点。

在一些参考文献中,使用第二个而不是第一个:

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')

出现错误是因为您使用的解析器。一般来说,如果你有HTML文件/代码,那么你需要使用html5lib(文档可以找到在这里) &如果你有XML文件/数据,那么你需要使用lxml(文档可以找到在这里)。你也可以为HTML文件/代码使用lxml,但有时它会给出如上所示的错误。因此,最好根据数据/文件的类型明智地选择包。你也可以使用内置模块html_parser。但是,这有时也不起作用。

有关何时使用哪个包的详细信息,您可以查看详细信息在这里

运行这三个命令来确保你已经安装了所有相关的软件包:

pip install bs4
pip install html5lib
pip install lxml

然后,如果需要,重新启动您的Python IDE。

这样就可以解决所有与这个问题有关的问题了。

空白参数将导致最佳可用的警告 soup = BeautifulSoup(html)

---------------/UserWarning:没有显式指定解析器,因此我正在使用此系统的最佳可用HTML解析器(“html5lib”)。这通常不是问题,但如果您在另一个系统或不同的虚拟环境中运行这段代码,它可能使用不同的解析器并表现不同。----------------------/

python 3.7.7

19.3.4 CE

在python环境中安装LXML解析器。

pip install lxml

你的问题会解决的。你也可以使用内置的python包:

soup = BeautifulSoup(s,  "html.parser")

注意:“HTMLParser”模块已被重命名为“html”。在Python3中

实际上是其他作品中提到的三个选项。

# 1.
soup_object= BeautifulSoup(markup,"html.parser") #Python HTML parser


# 2.
pip install lxml
soup_object= BeautifulSoup(markup,'lxml') # C dependent parser


# 3.
pip install html5lib
soup_object= BeautifulSoup(markup,'html5lib') # C dependent parser

我的解决方案是从conda中删除lxml,并用pip重新安装它。

我在pycharm中使用python 3.8。我假设你没有安装"lxml"在你开始工作之前。这就是我所做的:


  1. 转到文件->设置
  2. 选择“;Python解释器;在左边的设置菜单栏,选择“Python解释器”;
  3. 点击"+"图标放在包列表上。
  4. 搜索“;lxml."
  5. 点击“Install package”;在“可用套餐”的左下角;窗口。

在我的情况下,我有一个过时版本的lxml包。所以我更新了它,这就解决了这个问题。

sudo python3 -m pip install lxml --upgrade

这个方法对我很有效。我想说的是,我是在虚拟环境中尝试这个方法的。第一:

pip install --upgrade bs4

其次,我使用了:

html.parser

而不是

html5lib

我修复了以下变化

之前更改

soup = BeautifulSoup(r.content, 'html5lib' )
print (soup.prettify())

后改变

soup = BeautifulSoup(r.content, features='html')
print(soup.prettify())

我的代码正常工作

BS4默认情况下需要HTML文档。因此,它将XML文档解析为HTML文档。在构造函数中传递features="xml"作为参数。它解决了我的问题。

如果你安装了多个版本的Python,你可能需要仔细检查你使用的解释器是否正确。

一旦我选择了正确的Python版本,就找到了lxml。