bs4.FeatureNotFound: No se pudo encontrar un generador de árboles con las características que solicitó: lxml. ¿Necesita instalar una biblioteca de analizador?

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?

Las salidas anteriores en mi terminal. Estoy en Mac OS 10.7.x. Tengo Python 2.7.1 y seguí este tutorial para obtener Beautiful Soup y lxml, que se instalaron correctamente y funcionan con un archivo de prueba separado ubicado aquí . En el script de Python que causa este error, he incluido esta línea: from pageCrawler import comparePages Y en el archivo pageCrawler he incluido las siguientes dos líneas: from bs4 import BeautifulSoup from urllib2 import urlopen

Se agradecería cualquier ayuda para descubrir cuál es el problema y cómo se puede resolver.

usuario3773048
fuente
¿Es htmluna url o el contenido html?
tommy.carstensen

Respuestas:

227

Tengo la sospecha de que esto está relacionado con el analizador que BS usará para leer el HTML. El documento está aquí , pero si eres como yo (en OSX) es posible que te quedes atascado con algo que requiere un poco de trabajo:

Notarás que en la página de documentación de BS4 anterior, señalan que, de manera predeterminada, BS4 usará el analizador HTML incorporado de Python. Suponiendo que esté en OSX, la versión de Python incluida en Apple es 2.7.2, que no es indulgente para el formato de caracteres. Llegué a este mismo problema, así que actualicé mi versión de Python para solucionarlo. Hacer esto de manera virtual minimizará la interrupción de otros proyectos.

Si hacer eso suena como un dolor, puede cambiar al analizador LXML:

pip install lxml

Y luego intente:

soup = BeautifulSoup(html, "lxml")

Dependiendo de su escenario, eso podría ser lo suficientemente bueno. Encontré esto lo suficientemente molesto como para garantizar la actualización de mi versión de Python. Con virtualenv, puede migrar sus paquetes con bastante facilidad.

James Errico
fuente
1
Para probar después de la instalación de 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
en mi entorno virtual, necesitaba instalar requests, bs4y lxmlantes BeautifulSoupanalizaba el contenido de mi página web.
noobninja el
Uff! Mad Mac, ¡no sé cuándo dejaré de lamentar mi decisión de comprar Mac!
Iqra
48

Para python básico listo para usar con bs4 instalado, puede procesar su xml con

soup = BeautifulSoup(html, "html5lib")

Sin embargo, si desea utilizar formatter = 'xml' , debe

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
Tim Seed
fuente
3
En un servidor remoto recién creado, html5lib no funcionó de fábrica para mí. Todavía tenía que hacer un pip install html5lib, después de lo cual todo funcionó bien.
petercoles
No funcionó para mí: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?si lo cambio html.parser, funciona
8bitjunkie
41

Preferí el analizador html de python integrado, sin instalación, sin dependencias

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

Ernst
fuente
Funciona mientras @Ernst mientras que el anterior no funcionó. ¡Gracias!
adrCoder
14

Estoy usando Python 3.6 y tuve el mismo error original en esta publicación. Después de ejecutar el comando:

python3 -m pip install lxml

resolvió mi problema

Bashar
fuente
En Docker también es necesarioapt install python-lxml
Walter
14

Ejecute estos tres comandos para asegurarse de que tiene todos los paquetes relevantes instalados:

pip install bs4
pip install html5lib
pip install lxml

Luego reinicie su IDE de Python, si es necesario.

Eso debería encargarse de todo lo relacionado con este tema.

Pikamander2
fuente
1
Esta es la solución real.
John Stud
8

En lugar de usar lxml, use html.parser, puede usar este fragmento de código:

soup = BeautifulSoup(html, 'html.parser')
Yogesh
fuente
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

Aunque BeautifulSoup admite el analizador HTML de forma predeterminada. Si desea utilizar cualquier otro analizador Python de terceros, debe instalar ese analizador externo como (lxml).

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

Pero si no especificó ningún analizador como parámetro, recibirá una advertencia de que no se especificó ningún analizador.

soup_object= BeautifulSoup(markup) #Warnning

Para usar cualquier otro analizador externo, debe instalarlo y luego especificarlo. me gusta

pip install lxml

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

El analizador externo tiene dependencia de python que puede tener alguna ventaja y desventaja.

Projesh Bhoumik
fuente
3

Encontré el mismo problema. Encontré que la razón es que tenía un paquete de Python Six ligeramente anticuado.

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

Actualizar su paquete de seis resolverá el problema:

sudo pip install six=1.10.0
Qiao Yang
fuente
sudo pip install six==1.10.0
pyd
2

Instale el analizador LXML en el entorno python.

pip install lxml

Su problema será resuelto. También puede usar el paquete python incorporado para lo mismo que:

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

Nota: El módulo "HTMLParser" ha cambiado de nombre a "html.parser" en Python3

Shankar Vishnu
fuente
0

En algunas referencias, use el segundo en lugar del primero:

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
abhishekPakrashi
fuente
Debería proporcionar un poco más de detalle en su respuesta
Michael
0

El error se produce debido al analizador que está utilizando. En general, si tiene un archivo / código HTML, entonces debe usarlo html5lib(la documentación se puede encontrar aquí ) y en caso de que tenga un archivo / datos XML, entonces debe usarlo lxml(la documentación se puede encontrar aquí ). También puede usar el lxmlarchivo / código HTML, pero a veces da un error como el anterior. Por lo tanto, es mejor elegir el paquete sabiamente según el tipo de datos / archivo. También puede usar html_parsercuál es el módulo incorporado. Pero, esto también a veces no funciona.

Para obtener más detalles sobre cuándo usar qué paquete, puede ver los detalles aquí

Pranav Bhendawade
fuente
0

El parámetro en blanco dará como resultado una advertencia para el mejor disponible.
sopa = BeautifulSoup (html)

--------------- / UserWarning: no se especificó explícitamente ningún analizador, por lo que estoy usando el mejor analizador HTML disponible para este sistema ("html5lib"). Esto generalmente no es un problema, pero si ejecuta este código en otro sistema, o en un entorno virtual diferente, puede usar un analizador diferente y comportarse de manera diferente .--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

usuario176105
fuente