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.



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.


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

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


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


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.


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

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.


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

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


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

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.