bs4.FeatureNotFound: Je n'ai pas trouvé de constructeur d'arbres avec les fonctionnalités que vous avez demandées: lxml. Avez-vous besoin d'installer une bibliothèque parser?

...
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 j'ai suivi ce tutoriel pour obtenir de belles potages et lxml, qui ont tous les deux été installés avec succès et fonctionnent avec un fichier 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 BeautifulSoup from urllib2 import urlopen

toute aide pour comprendre ce qu'est le problème et comment il peut être résolu serait grandement apprécié.

98
demandé sur user3773048 2014-06-25 04:12:08

10 réponses

je soupçonne que cela est lié à l'analyseur que BS utilisera pour lire le HTML. Ils document 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 font remarquer que par défaut BS4 utilisera L'analyseur HTML intégré à Python. En supposant que vous êtes dans OSX, la version de Python fournie par Apple est 2.7.2 ce qui n'est pas clément pour le formatage des caractères. J'ai frappé ce même problème, donc j'ai mis à jour ma version de Python pour travailler autour. Faire cela en virtualenv minimisera les perturbations pour les autres projets.

si faire cela ressemble à une douleur, vous pouvez passer à L'analyseur LXML:

pip install lxml

et ensuite essayer:

soup = BeautifulSoup(html, "lxml")

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

101
répondu James Errico 2018-05-06 13:31:54

De base de la boîte python avec bs4 installé, vous pouvez traiter votre xml avec

soup = BeautifulSoup(html, "html5lib")

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

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
31
répondu Tim Seed 2017-02-10 04:24:46

j'ai préféré construit en Python HTML parser, pas d'installation pas de dépendances soup = BeautifulSoup (s, "html.parser")

6
répondu Ernst 2017-05-10 08:55:25

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

cela a résolu mon problème

5
répondu Bashar 2018-01-22 07:33:35

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 dépassé.

>>> 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 vos six paquets résoudra le problème:

sudo pip install six=1.10.0
3
répondu Qiao Yang 2017-03-04 06:17:33

Parser n'est pas installé sur votre machine ou introuvable.

essayez cette commande de cmd:

pip install lxml

3
répondu Serajush Salekin 2017-12-28 14:28:57

bien que BeautifulSoup supporte le parser HTML par défaut Si vous voulez utiliser un autre parseur Python tiers, vous devez installer ce parseur externe comme(lxml).

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

Mais si vous n'avez pas spécifié un analyseur comme paramètre, vous obtiendrez un avertissement qu'aucun analyseur spécifié.

soup_object= BeautifulSoup(markup) #Warnning

pour utiliser un autre analyseur externe, vous devez l'installer et le spécifier. comme

pip install lxml

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

parser externe ont la dépendance de c et python qui peut avoir un certain avantage et désavantage.

2
répondu Projesh Bhoumik 2018-03-24 11:06:12

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

soup = BeautifulSoup(html, 'html.parser')
1
répondu Yogesh 2018-02-13 12:28:45

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

pip install -U lxml

1
répondu duhaime 2018-03-04 18:30:40

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')
0
répondu abhishekPakrashi 2018-04-02 14:07:10