bs4.FeatureNotFound: Impossibile trovare un generatore di alberi con le funzionalità richieste: lxml. Devi installare una libreria di parser?


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?

Le uscite sopra sul mio terminale. Sono su Mac OS 10.7.x. Ho Python 2.7.1 e ho seguito questo tutorial per ottenere Beautiful Soup e lxml, che sono stati installati correttamente e funzionano con un file di test separato che si trova qui . Nello script Python che causa questo errore, ho incluso questa riga: from pageCrawler import comparePages E nel file pageCrawler ho incluso le seguenti due righe: from bs4 import BeautifulSoup from urllib2 import urlopen

Qualsiasi aiuto per capire qual è il problema e come risolverlo sarebbe molto apprezzato.



L' htmlURL o l'HTML sono contenuti?
tommy.carstensen,

Risposte:


227

Ho il sospetto che ciò sia correlato al parser che BS utilizzerà per leggere l'HTML. Essi documento è qui , ma se siete come me (su OSX) si potrebbe essere bloccato con qualcosa che richiede un po 'di lavoro:

Noterai che nella pagina di documentazione BS4 sopra, sottolineano che per impostazione predefinita BS4 utilizzerà il parser HTML incorporato di Python. Supponendo che tu sia in OSX, la versione di Python in bundle di Apple è 2.7.2 che non è indulgente per la formattazione dei caratteri. Ho riscontrato questo stesso problema, quindi ho aggiornato la mia versione di Python per aggirare il problema. In questo modo virtualenv minimizzerà l'interruzione di altri progetti.

Se farlo suona come un dolore, puoi passare al parser LXML:

pip install lxml

E poi prova:

soup = BeautifulSoup(html, "lxml")

A seconda del tuo scenario, potrebbe essere abbastanza buono. Ho trovato questo abbastanza fastidioso da giustificare l'aggiornamento della mia versione di Python. Usando virtualenv, puoi migrare i tuoi pacchetti abbastanza facilmente.


1
Per python -c 'import requests ; from bs4 import BeautifulSoup ; r = requests.get("https://www.allrecipes.com/recipes/96/salad/") ; soup = BeautifulSoup(r.text, "lxml") '
eseguire il

nel mio ENV virtuale, avevo bisogno di installare requests, bs4e lxmlprima che BeautifulSoupsarebbe analizzare il mio contenuto della pagina web.
noobninja,

Uff! Mad Mac, non so quando smetterò di pentirmi della mia decisione di acquistare Mac!
Iqra.

48

Per un semplice python out of the box con bs4 installato, puoi elaborare il tuo xml con

soup = BeautifulSoup(html, "html5lib")

Se tuttavia si desidera utilizzare formatter = 'xml', è necessario

pip3 install lxml

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

3
Su un server remoto appena avviato, html5lib non ha funzionato per me. Dovevo ancora fare un pip install html5lib, dopodiché tutto funzionava bene.
petercoles dal

Non ha funzionato per me: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?se lo cambio per html.parserfarlo funziona
8bitjunkie

41

Ho preferito il parser HTML integrato in Python, nessuna installazione, nessuna dipendenza

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


Funziona mentre @Ernst mentre il precedente non funzionava. Grazie!
adrCoder

14

Sto usando Python 3.6 e ho avuto lo stesso errore originale in questo post. Dopo aver eseguito il comando:

python3 -m pip install lxml

ha risolto il mio problema


In Docker è anche necessarioapt install python-lxml
Walter,

14

Esegui questi tre comandi per assicurarti di aver installato tutti i pacchetti rilevanti:

pip install bs4
pip install html5lib
pip install lxml

Quindi riavvia il tuo IDE Python, se necessario.

Ciò dovrebbe occuparsi di tutto ciò che riguarda questo problema.


1
Questa è la vera soluzione.
John Stud,

8

Invece di usare lxml usa html.parser, puoi usare questo pezzo di codice:

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?
alex,

4

Sebbene BeautifulSoup supporti il ​​parser HTML per impostazione predefinita Se si desidera utilizzare altri parser Python di terze parti, è necessario installare quel parser esterno come (lxml).

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

Ma se non si specifica alcun parser come parametro, verrà visualizzato un avviso che non è stato specificato alcun parser.

soup_object= BeautifulSoup(markup) #Warnning

Per utilizzare qualsiasi altro parser esterno è necessario installarlo e quindi specificarlo. piace

pip install lxml

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

Il parser esterno ha una dipendenza c e python che può avere qualche vantaggio e svantaggio.


3

Ho riscontrato lo stesso problema. Ho scoperto che il motivo era che avevo un pacchetto Python Six leggermente obsoleto.

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

L'aggiornamento del tuo pacchetto sei risolverà il problema:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
pyd,

2

Installa il parser LXML in ambiente Python.

pip install lxml

Il tuo problema sarà risolto. Puoi anche usare il pacchetto Python integrato per lo stesso di:

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

Nota: il modulo "HTMLParser" è stato rinominato in "html.parser" in Python3


0

In alcuni riferimenti, utilizzare il secondo anziché il primo:

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

Dovresti fornire un po 'più di dettaglio nella tua risposta
Michael,

0

L'errore sta arrivando a causa del parser che stai utilizzando. In generale, se si dispone di file / codice HTML, è necessario utilizzare html5lib(la documentazione può essere trovata qui ) e nel caso in cui si disponga di file / dati XML, è necessario utilizzare lxml(la documentazione può essere trovata qui ). È possibile utilizzare anche lxmlper file / codice HTML ma a volte genera un errore come sopra. Quindi, meglio scegliere il pacchetto saggiamente in base al tipo di dati / file. Puoi anche usare il html_parsermodulo integrato. Ma a volte anche questo non funziona.

Per maggiori dettagli su quando usare quale pacchetto puoi vedere i dettagli qui


0

Il parametro vuoto genererà un avviso per il migliore disponibile.
soup = BeautifulSoup (html)

--------------- / UserWarning: nessun parser è stato specificato esplicitamente, quindi sto usando il miglior parser HTML disponibile per questo sistema ("html5lib"). Questo di solito non è un problema, ma se si esegue questo codice su un altro sistema o in un ambiente virtuale diverso, è possibile utilizzare un parser diverso e comportarsi in modo diverso .--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.