bs4.FeatureNotFound:リクエストした機能を備えたツリービルダーが見つかりませんでした:lxml。パーサーライブラリをインストールする必要がありますか?


224
...
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ファイルに、次の2行を含めました。 from bs4 import BeautifulSoup from urllib2 import urlopen

問題が何であるか、そしてそれをどのように解決できるかを理解するための助けがあれば、高く評価されます。



あるhtmlURLやHTMLの内容は?
tommy.carstensen 2018年

回答:


227

これは、BSがHTMLを読み取るために使用するパーサーに関連していると疑っています。彼らのドキュメントはここありますが、あなたが私のように(OSX上で)少し作業が必要なもので立ち往生している可能性があります。

上記のBS4ドキュメントページで、デフォルトでBS4がPython組み込みのHTMLパーサーを使用することを指摘していることに気づくでしょう。OSXを使用していると仮定すると、AppleにバンドルされているPythonのバージョンは2.7.2であり、これは文字フォーマットに寛容ではありません。私はこの同じ問題にぶつかったので、それを回避するためにPythonのバージョンをアップグレードしました。virtualenvでこれを行うと、他のプロジェクトの中断を最小限に抑えることができます。

それを行うのが面倒に聞こえる場合は、LXMLパーサーに切り替えることができます。

pip install lxml

そして試してください:

soup = BeautifulSoup(html, "lxml")

シナリオによっては、それで十分かもしれません。私はこれが私のバージョンのPythonのアップグレードを保証するのに十分に迷惑であることがわかりました。virtualenvを使用すると、パッケージをかなり簡単に移行できます


1
pipのインストール後にテストするには:python -c 'import requests ; from bs4 import BeautifulSoup ; r = requests.get("https://www.allrecipes.com/recipes/96/salad/") ; soup = BeautifulSoup(r.text, "lxml") '
ViFI

私の仮想ENVで、私はインストールするのに必要なrequestsbs4lxml前にBeautifulSoup私のWebページのコンテンツを解析します。
noobninja

うっ!マッドマック、いつマックを買う決心を後悔するのをやめるかわからない!
Iqra。

48

bs4がインストールされた基本的なそのままのpythonの場合、xmlを次のように処理できます

soup = BeautifulSoup(html, "html5lib")

ただし、formatter = 'xml'を使用する場合は、

pip3 install lxml

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

3
新しくスピンアップしたリモートサーバーでは、html5libはそのままでは機能しませんでした。私はまだをしなければなりませんでしたがpip install html5lib、その後はすべてうまくいきました。
petercoles

うまくbs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?いきませんでした:変更してhtml.parserも動作します
8bitjunkie

41

私は組み込みのpython htmlパーサーを優先しました。インストールや依存関係はありません。

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


@Ernstは機能しますが、以前は機能しませんでした。ありがとう!
adrCoder

14

私はPython 3.6を使用していますが、この投稿でも同じエラーが発生しました。コマンドを実行した後:

python3 -m pip install lxml

それは私の問題を解決しました


Dockerでは、次のことも必要ですapt install python-lxml
Walter

14

次の3つのコマンドを実行して、関連するすべてのパッケージがインストールされていることを確認します。

pip install bs4
pip install html5lib
pip install lxml

次に、必要に応じてPython IDEを再起動します。

これで、この問題に関連することはすべて処理されます。


1
これが実際の解決策です。
ジョンスタッド

8

lxml use html.parserの代わりに、次のコードを使用できます。

soup = BeautifulSoup(html, 'html.parser')

2
vendor.bs.bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html.parser. Do you need to install a parser library?
アレックス

4

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の依存関係があり、いくつかの利点と欠点があります。


3

同じ問題が発生しました。私が理由を見つけたのは、少し古い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

6つのパッケージをアップグレードすると、問題が解決します。

sudo pip install six=1.10.0

sudo pip install six==1.10.0
pyd 2017年

2

LXMLパーサーをPython環境にインストールします。

pip install lxml

あなたの問題は解決されます。組み込みのpythonパッケージを同じように使用することもできます。

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

注:「HTMLParser」モジュールはPython3で「html.parser」に名前が変更されました


0

一部の参照では、最初の代わりに2番目を使用します。

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

回答にもう少し詳細を入力する必要があります
Michael

0

使用しているパーサーが原因でエラーが発生しています。一般に、HTMLファイル/コードがある場合は、使用する必要がありますhtml5lib(ドキュメントはここにあります)。XMLファイル/データがある場合は、使用する必要がありますlxml(ドキュメントはここにあります)。lxmlHTMLファイル/コードにも使用できますが、上記のエラーが発生する場合があります。したがって、データ/ファイルのタイプに基づいてパッケージを賢く選択することをお勧めします。html_parser組み込みモジュールであるwhichを使用することもできます。しかし、これも時々機能しません。

どのパッケージをいつ使用するかに関する詳細については、ここで詳細を確認できます


0

空白のパラメーターを使用すると、最善の結果が得られるという警告が表示されます。
soup = BeautifulSoup(html)

--------------- / UserWarning:パーサーが明示的に指定されていなかったため、このシステムで使用できる最高のHTMLパーサー( "html5lib")を使用しています。これは通常問題ではありませんが、このコードを別のシステムまたは別の仮想環境で実行すると、別のパーサーが使用され、動作が異なる場合があります。--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.