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

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

Cualquier ayuda para averiguar cuál es el problema y cómo puede resolverse sería muy apreciada.

Tengo la sospecha de que esto está relacionado con el analizador que BS utilizará para leer el HTML. El documento está aquí , pero si eres como yo (en OSX) podrías estar atrapado en algo que requiere un poco de trabajo:

Notará que en la página de documentación de BS4 anterior, señalan que, de forma predeterminada, BS4 utilizará 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. Me topé con este mismo problema, así que actualicé mi versión de Python para solucionarlo. Hacer esto en un virtualenv 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 tu situación, eso podría ser lo suficientemente bueno. Encontré esto lo suficientemente molesto como para justificar la actualización de mi versión de Python. Usando virtualenv, puedes migrar tus paquetes con bastante facilidad.

Para Python fuera de la caja con bs4 instalado, puedes procesar tu xml con

 soup = BeautifulSoup(html, "html5lib") 

Sin embargo, si desea utilizar formatter = ‘xml’ , debe

 pip3 install lxml soup = BeautifulSoup(html, features="xml") 

Preferí construirlo en el analizador html de Python, no instale ninguna dependencia soup = BeautifulSoup (s, “html.parser”)

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

Me encontré con el mismo problema. Descubrí que la razón es que tenía un paquete de python six ligeramente desactualizado.

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

La actualización de su paquete de seis resolverá el problema:

 sudo pip install six=1.10.0 

Aunque BeautifulSoup es compatible con el analizador HTML de forma predeterminada. Si desea usar 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 la dependencia de cy python, lo que puede tener alguna ventaja y desventaja.

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

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

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

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