bs4.FeatureNotFound: Impossible de trouver un générateur d'arborescence avec les fonctionnalités que vous avez demandées: lxml. Avez-vous besoin d'installer une bibliothèque d'analyseur?

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?

Les sorties ci-dessus sur mon terminal. Je suis sous Mac OS 10.7.x. J'ai Python 2.7.1 et j'ai suivi ce tutoriel pour obtenir Beautiful Soup et lxml, qui ont tous deux été installés avec succès et fonctionnent avec un fichier de test distinct situé ici . Dans le script Python qui provoque cette erreur, j'ai inclus cette ligne: from pageCrawler import comparePages Et dans le fichier pageCrawler j'ai inclus les deux lignes suivantes: from bs4 import BeautifulSoup from urllib2 import urlopen

Toute aide pour déterminer quel est le problème et comment le résoudre serait très appréciée.

user3773048
la source
Est-ce htmlune URL ou un contenu HTML?
tommy.carstensen

Réponses:

227

Je soupçonne que cela est lié à l'analyseur que BS utilisera pour lire le HTML. Ils documentent est ici , mais si vous êtes comme moi (sur OSX), vous pourriez être coincé avec quelque chose qui nécessite un peu de travail:

Vous remarquerez que dans la page de documentation BS4 ci-dessus, ils soulignent que par défaut BS4 utilisera l'analyseur HTML intégré Python. En supposant que vous êtes sous OSX, la version de Python fournie par Apple est 2.7.2, ce qui n'est pas indulgent pour le formatage des caractères. J'ai rencontré ce même problème, j'ai donc mis à niveau ma version de Python pour le contourner. Faire cela dans un virtualenv minimisera la perturbation des autres projets.

Si cela ressemble à une douleur, vous pouvez passer à l'analyseur LXML:

pip install lxml

Et puis essayez:

soup = BeautifulSoup(html, "lxml")

Selon votre scénario, cela pourrait être suffisant. J'ai trouvé cela assez ennuyeux pour justifier la mise à niveau de ma version de Python. En utilisant virtualenv, vous pouvez migrer vos packages assez facilement.

James Errico
la source
1
Pour tester après l'installation 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
dans mon environnement virtuel, j'avais besoin d'installer requests, bs4et lxmlavant d' BeautifulSoupanalyser le contenu de ma page Web.
noobninja
Uff! Mad Mac, je ne sais pas quand j'arrêterai de regretter ma décision d'acheter Mac!
Iqra.
48

Pour python basique prêt à l'emploi avec bs4 installé, vous pouvez traiter votre xml avec

soup = BeautifulSoup(html, "html5lib")

Si toutefois vous souhaitez utiliser formatter = 'xml', vous devez

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
Tim Seed
la source
3
Sur un serveur distant récemment lancé, html5lib n'a pas fonctionné pour moi. Je devais encore faire un pip install html5lib, après quoi tout fonctionnait bien.
petercoles
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?Ça n'a pas marché pour moi: si je le change, html.parserça marche
8bitjunkie
41

J'ai préféré l'analyseur html intégré en python, pas d'installation ni de dépendances

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

Ernst
la source
Cela fonctionne pendant @Ernst tandis que le précédent ne fonctionnait pas. Merci!
adrCoder
14

J'utilise Python 3.6 et j'ai eu la même erreur d'origine dans ce post. Après avoir exécuté la commande:

python3 -m pip install lxml

cela a résolu mon problème

Bashar
la source
Dans Docker, il est également nécessaire deapt install python-lxml
Walter
14

Exécutez ces trois commandes pour vous assurer que tous les packages appropriés sont installés:

pip install bs4
pip install html5lib
pip install lxml

Redémarrez ensuite votre IDE Python, si nécessaire.

Cela devrait s'occuper de tout ce qui touche à ce problème.

Pikamander2
la source
1
C'est la vraie solution.
John Stud
8

Au lieu d'utiliser lxml, utilisez html.parser, vous pouvez utiliser ce morceau de code:

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

Bien que BeautifulSoup prenne en charge l'analyseur HTML par défaut Si vous souhaitez utiliser tout autre analyseur Python tiers, vous devez installer cet analyseur externe comme (lxml).

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

Mais si vous ne spécifiez aucun analyseur comme paramètre, vous obtiendrez un avertissement qu'aucun analyseur spécifié.

soup_object= BeautifulSoup(markup) #Warnning

Pour utiliser tout autre analyseur externe, vous devez l'installer puis le spécifier. comme

pip install lxml

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

L'analyseur externe a des dépendances c et python qui peuvent avoir certains avantages et inconvénients.

Projesh Bhoumik
la source
3

J'ai rencontré le même problème. J'ai trouvé la raison en est que j'avais un paquet python six légèrement obsolète.

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

La mise à niveau de votre package six résoudra le problème:

sudo pip install six=1.10.0
Qiao Yang
la source
sudo pip install six==1.10.0
pyd
2

Installez l'analyseur LXML dans un environnement python.

pip install lxml

Votre problème sera résolu. Vous pouvez également utiliser le package python intégré pour la même chose que:

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

Remarque: Le module "HTMLParser" a été renommé "html.parser" en Python3

Shankar Vishnu
la source
0

Dans certaines références, utilisez la seconde au lieu de la première:

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
abhishekPakrashi
la source
Vous devriez fournir un peu plus de détails dans votre réponse
Michael
0

L'erreur vient à cause de l'analyseur que vous utilisez. En général, si vous avez un fichier / code HTML, vous devez utiliser html5lib(la documentation peut être trouvée ici ) et au cas où vous avez un fichier / des données XML, alors vous devez utiliser lxml(la documentation peut être trouvée ici ). Vous pouvez également utiliser lxmlpour le fichier / code HTML mais parfois cela donne une erreur comme ci-dessus. Il vaut donc mieux choisir judicieusement le package en fonction du type de données / fichier. Vous pouvez également utiliser le html_parsermodule intégré. Mais, cela aussi parfois ne fonctionne pas.

Pour plus de détails sur le moment d’utiliser quel package vous pouvez voir les détails ici

Pranav Bhendawade
la source
0

Un paramètre vide entraînera un avertissement pour la meilleure disponibilité.
soupe = BeautifulSoup (html)

--------------- / UserWarning: Aucun analyseur n'a été explicitement spécifié, donc j'utilise le meilleur analyseur HTML disponible pour ce système ("html5lib"). Ce n'est généralement pas un problème, mais si vous exécutez ce code sur un autre système ou dans un environnement virtuel différent, il peut utiliser un analyseur différent et se comporter différemment .--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

user176105
la source