bs4.FeatureNotFound: Es konnte kein Tree Builder mit den von Ihnen angeforderten Funktionen gefunden werden: lxml. Müssen Sie eine Parser-Bibliothek installieren?

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?

Die oben genannten Ausgänge auf meinem Terminal. Ich bin unter Mac OS 10.7.x. Ich habe Python 2.7.1 und habe dieses Tutorial befolgt , um Beautiful Soup und lxml zu erhalten, die beide erfolgreich installiert wurden und mit einer separaten Testdatei arbeiten, die sich hier befindet . In das Python-Skript, das diesen Fehler verursacht, habe ich diese Zeile from pageCrawler import comparePages eingefügt : Und in die pageCrawler-Datei habe ich die folgenden zwei Zeilen eingefügt: from bs4 import BeautifulSoup from urllib2 import urlopen

Jede Hilfe, um herauszufinden, was das Problem ist und wie es gelöst werden kann, wäre sehr dankbar.

user3773048
quelle
Ist htmleine URL oder ein HTML-Inhalt?
Tommy.carstensen

Antworten:

227

Ich habe den Verdacht, dass dies mit dem Parser zusammenhängt, mit dem BS den HTML-Code liest. Das Dokument ist hier , aber wenn Sie wie ich (unter OSX) sind, stecken Sie möglicherweise in etwas fest, das ein wenig Arbeit erfordert:

Sie werden feststellen, dass auf der obigen BS4-Dokumentationsseite darauf hingewiesen wird, dass BS4 standardmäßig den in Python integrierten HTML-Parser verwendet. Angenommen, Sie befinden sich in OSX, ist die von Apple gebündelte Version von Python 2.7.2, was für die Zeichenformatierung nicht nachsichtig ist. Ich bin auf dasselbe Problem gestoßen und habe meine Python-Version aktualisiert, um es zu umgehen. Wenn Sie dies in einer virtuellen Umgebung tun, werden Störungen bei anderen Projekten minimiert.

Wenn dies schmerzhaft klingt, können Sie zum LXML-Parser wechseln:

pip install lxml

Und dann versuchen Sie:

soup = BeautifulSoup(html, "lxml")

Abhängig von Ihrem Szenario könnte dies gut genug sein. Ich fand das ärgerlich genug, um ein Upgrade meiner Python-Version zu rechtfertigen. Mit virtualenv können Sie Ihre Pakete relativ einfach migrieren .

James Errico
quelle
1
So testen Sie nach der Pip-Installation:python -c 'import requests ; from bs4 import BeautifulSoup ; r = requests.get("https://www.allrecipes.com/recipes/96/salad/") ; soup = BeautifulSoup(r.text, "lxml") '
ViFI
in meinem virtuellen env, musste ich installieren requests, bs4und lxmlvor BeautifulSoupmeiner Webseite Inhalt analysieren würde.
Noobninja
Uff! Mad Mac, ich weiß nicht, wann ich aufhören werde, meine Entscheidung, einen Mac zu kaufen, zu bereuen!
Iqra.
48

Für grundlegende sofort einsatzbereite Python-Versionen mit installiertem BS4 können Sie Ihre XML-Datei mit verarbeiten

soup = BeautifulSoup(html, "html5lib")

Wenn Sie jedoch formatter = 'xml' verwenden möchten, müssen Sie dies tun

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
Tim Seed
quelle
3
Auf einem neu hochgefahrenen Remote-Server hat html5lib für mich nicht sofort funktioniert. Ich musste noch eine machen pip install html5lib, danach hat alles gut funktioniert.
Petercoles
Hat bei mir nicht funktioniert: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?Wenn ich es ändere, html.parserfunktioniert es
8bitjunkie
41

Ich bevorzugte eingebauten Python-HTML-Parser, keine Installation, keine Abhängigkeiten

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

Ernst
quelle
Es funktioniert, während @Ernst, während das vorherige nicht funktioniert hat. Vielen Dank!
AdrCoder
14

Ich verwende Python 3.6 und hatte den gleichen ursprünglichen Fehler in diesem Beitrag. Nachdem ich den Befehl ausgeführt habe:

python3 -m pip install lxml

es hat mein Problem gelöst

Bashar
quelle
In Docker ist es auch notwendigapt install python-lxml
Walter
14

Führen Sie diese drei Befehle aus, um sicherzustellen, dass alle relevanten Pakete installiert sind:

pip install bs4
pip install html5lib
pip install lxml

Starten Sie dann bei Bedarf Ihre Python-IDE neu.

Das sollte sich um alles kümmern, was mit diesem Problem zu tun hat.

Pikamander2
quelle
1
Dies ist die eigentliche Lösung.
John Stud
8

Anstatt lxml mit html.parser zu verwenden, können Sie diesen Code verwenden:

soup = BeautifulSoup(html, 'html.parser')
Yogesh
quelle
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?
alex
4

Obwohl BeautifulSoup standardmäßig den HTML-Parser unterstützt Wenn Sie andere Python-Parser von Drittanbietern verwenden möchten, müssen Sie diesen externen Parser wie (lxml) installieren.

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

Wenn Sie jedoch keinen Parser als Parameter angegeben haben, wird eine Warnung angezeigt, dass kein Parser angegeben wurde.

soup_object= BeautifulSoup(markup) #Warnning

Um einen anderen externen Parser zu verwenden, müssen Sie ihn installieren und dann angeben. mögen

pip install lxml

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

Externe Parser haben c- und Python-Abhängigkeiten, die einige Vor- und Nachteile haben können.

Projesh Bhoumik
quelle
3

Ich bin auf das gleiche Problem gestoßen. Ich fand den Grund, dass ich ein etwas veraltetes Python-Six-Paket hatte.

>>> 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

Ein Upgrade Ihres Six-Pakets löst das Problem:

sudo pip install six=1.10.0
Qiao Yang
quelle
sudo pip install six==1.10.0
Pyd
2

Installieren Sie den LXML-Parser in einer Python-Umgebung.

pip install lxml

Ihr Problem wird gelöst. Sie können das integrierte Python-Paket auch für Folgendes verwenden:

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

Hinweis: Das Modul "HTMLParser" wurde in Python3 in "html.parser" umbenannt

Shankar Vishnu
quelle
0

Verwenden Sie in einigen Referenzen die zweite anstelle der ersten:

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
abhishekPakrashi
quelle
Sie sollten ein bisschen mehr Details in Ihrer Antwort
Michael
0

Der Fehler tritt aufgrund des von Ihnen verwendeten Parsers auf. Wenn Sie über eine HTML-Datei / einen HTML-Code verfügen, müssen Sie diese im Allgemeinen verwenden html5lib(Dokumentation finden Sie hier ). Falls Sie über eine XML-Datei / Daten verfügen, müssen Sie diese verwenden lxml(Dokumentation finden Sie hier ). Sie können auch lxmlfür HTML-Datei / Code verwenden, aber manchmal gibt es einen Fehler wie oben. Wählen Sie das Paket also besser mit Bedacht aus, basierend auf dem Typ der Daten / Dateien. Sie können auch html_parserdas eingebaute Modul verwenden. Dies funktioniert aber auch manchmal nicht.

Weitere Informationen dazu, wann Sie welches Paket verwenden sollen, finden Sie hier

Pranav Bhendawade
quelle
0

Der leere Parameter führt zu einer Warnung für die bestmögliche Verfügbarkeit.
suppe = BeautifulSoup (html)

--------------- / UserWarning: Es wurde kein Parser explizit angegeben, daher verwende ich den besten verfügbaren HTML-Parser für dieses System ("html5lib"). Dies ist normalerweise kein Problem, aber wenn Sie diesen Code auf einem anderen System oder in einer anderen virtuellen Umgebung ausführen, verwendet er möglicherweise einen anderen Parser und verhält sich anders .--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

user176105
quelle