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é.
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.
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")
j'ai préféré construit en Python HTML parser, pas d'installation pas de dépendances soup = BeautifulSoup (s, "html.parser")
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
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
Parser n'est pas installé sur votre machine ou introuvable.
essayez cette commande de cmd:
pip install lxml
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.
au lieu d'utiliser lxml utilisez html.parser, vous pouvez utiliser ce morceau de code:
soup = BeautifulSoup(html, 'html.parser')
j'ai résolu cette erreur en mettant à jour ma distribution lxml:
pip install -U lxml
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')