web-dev-qa-db-fra.com

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

...
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 sur Mac OS 10.7.x. J'ai Python 2.7.1 et ai suivi ce tutoriel pour obtenir Beautiful Soup et lxml, qui ont été installés avec succès et fonctionnent avec un fichier de test séparé 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 BeautifulSoupfrom urllib2 import urlopen

Toute aide pour déterminer quel est le problème et comment le résoudre peut être grandement appréciée.

117
user3773048

Je soupçonne que cela est lié à l'analyseur que BS utilisera pour lire le code HTML. Ils le document est ici , mais si vous êtes comme moi (sous OSX), vous risquez de vous retrouver 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é de Python. En supposant que vous soyez sous OSX, la version de Python fournie avec Apple est 2.7.2, ce qui n’est pas indulgent pour le formatage des caractères. J'ai rencontré le même problème et j'ai donc mis à niveau ma version de Python pour y remédier. Faire cela dans un environnement virtuel minimisera la perturbation d'autres projets.

Si cela vous semble pénible, vous pouvez passer à l'analyseur LXML:

pip install lxml

Et puis essayez:

soup = BeautifulSoup(html, "lxml")

Selon votre scénario, cela pourrait suffire. J'ai trouvé cela assez agaçant pour justifier la mise à niveau de ma version de Python. En utilisant virtualenv, vous pouvez migrer vos paquets assez facilement.

126
James Errico

Pour un python prêt à l'emploi avec BS4 installé, vous pouvez traiter votre fichier XML

soup = BeautifulSoup(html, "html5lib")

Si toutefois vous voulez utiliser formatter = 'xml' alors vous devez 

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
34
Tim Seed

Je préférais un analyseur syntaxique HTML en python, aucune installation, aucune dépendance.

12
Ernst

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

python3 -m pip install lxml

ça a résolu mon problème

6
Bashar

J'ai rencontré le même problème. J'ai trouvé que la raison 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

Mettre à jour votre paquet six résoudra le problème:

Sudo pip install six=1.10.0
4
Qiao Yang

La bibliothèque de l'analyseur n'est pas installée sur votre ordinateur ou n'est pas trouvée. 

Essayez cette commande depuis cmd:

pip install lxml

3
Serajush Salekin

Bien que BeautifulSoup prenne en charge l’analyseur HTML par défaut Si vous souhaitez utiliser un 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 en paramètre, vous recevrez un avertissement qu'aucun analyseur ne spécifie.

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 

Les analyseurs externes ont des dépendances c et python qui peuvent présenter des avantages et des inconvénients.

2
Projesh Bhoumik

J'ai résolu cette erreur en mettant à jour ma distribution lxml:

pip install -U lxml

2
duhaime

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

soup = BeautifulSoup(html, 'html.parser')
1
Yogesh
conda install lxml 

travaillé pour moi à partir de Virtual Environment.
C'était sur Windows 10.

0
blackholes
  1. python -m pip install lxml (en cmd)

  2. importer lxml (dans votre code/projet)

0
SAyantan GHosh

Dans certaines références, utilisez le second au lieu du premier:

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