bs4.FeatureNotFound: Nie można znaleźć konstruktora drzewa z żądanymi funkcjami: lxml. Czy musisz zainstalować bibliotekę analizatora składni?


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?

Powyższe dane wyjściowe na moim terminalu. Korzystam z systemu Mac OS 10.7.x. Mam Python 2.7.1 i postępowałem zgodnie z tym samouczkiem, aby uzyskać Beautiful Soup i lxml, które oba zostały pomyślnie zainstalowane i działają z osobnym plikiem testowym znajdującym się tutaj . W skrypcie Python, który powoduje ten błąd, umieściłem ten wiersz: from pageCrawler import comparePages A w pliku pageCrawler zawarłem następujące dwa wiersze: from bs4 import BeautifulSoup from urllib2 import urlopen

Doceniamy wszelką pomoc w ustaleniu, na czym polega problem i jak można go rozwiązać.



Czy htmladres URL lub zawartość HTML?
tommy.carstensen

Odpowiedzi:


227

Podejrzewam, że jest to związane z analizatorem składni, którego BS użyje do odczytania HTML. Oni dokument jest tutaj , ale jeśli jesteś podobny do mnie (na OSX) może być zatrzymany z czymś, co wymaga trochę pracy:

Zauważysz, że na powyższej stronie dokumentacji BS4 wskazują one, że domyślnie BS4 będzie używać wbudowanego analizatora HTML Pythona. Zakładając, że jesteś w OSX, wersja Pythona w pakiecie Apple to 2.7.2, która nie jest łagodna do formatowania znaków. Wystąpił ten sam problem, więc zaktualizowałem swoją wersję Pythona, aby go obejść. Wykonanie tego w virtualenv zminimalizuje zakłócenia w innych projektach.

Jeśli to brzmi jak ból, możesz przełączyć się na parser LXML:

pip install lxml

A następnie spróbuj:

soup = BeautifulSoup(html, "lxml")

W zależności od scenariusza może to być wystarczająco dobre. Uznałem to za wystarczająco denerwujące, aby uzasadnić aktualizację mojej wersji Pythona. Korzystając z virtualenv, możesz dość łatwo migrować swoje pakiety .


1
Aby przetestować po instalacji 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

w mojej wirtualnej env musiałem zainstalować requests, bs4a lxmlprzed BeautifulSoupanalizą zawartości mojej strony internetowej.
noobninja

Uff! Mad Mac, nie wiem, kiedy przestanę żałować mojej decyzji o zakupie Maca!
Iqra.

48

Dla podstawowego, gotowego do użycia Pythona z zainstalowanym BS4, możesz przetwarzać swój plik XML za pomocą

soup = BeautifulSoup(html, "html5lib")

Jeśli jednak chcesz użyć formatter = 'xml' , musisz to zrobić

pip3 install lxml

soup = BeautifulSoup(html, features="xml")

3
Na nowo uruchomionym zdalnym serwerze html5lib nie działało dla mnie po wyjęciu z pudełka. Nadal musiałem zrobić pip install html5lib, po czym wszystko działało dobrze.
petercoles

Nie działało dla mnie: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?jeśli zmienię to na html.parserto działa
8bitjunkie

41

Wolałem wbudowany parser HTML Python, bez instalacji brak zależności

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


Działa podczas @Ernst, podczas gdy poprzednie nie działało. Dzięki!
adrCoder,

14

Używam Pythona 3.6 i miałem ten sam oryginalny błąd w tym poście. Po uruchomieniu polecenia:

python3 -m pip install lxml

rozwiązało mój problem


W Dockerze konieczne jest takżeapt install python-lxml
Walter

14

Uruchom te trzy polecenia, aby upewnić się, że masz zainstalowane wszystkie odpowiednie pakiety:

pip install bs4
pip install html5lib
pip install lxml

Następnie uruchom ponownie Python IDE, jeśli to konieczne.

To powinno załatwić wszystko związane z tym problemem.


1
To jest rzeczywiste rozwiązanie.
John Stud

8

Zamiast używać lxml użyj html.parser, możesz użyć tego fragmentu kodu:

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

Chociaż BeautifulSoup domyślnie obsługuje analizator składni HTML Jeśli chcesz używać innych analizatorów składni Pythona innych firm, musisz zainstalować zewnętrzny analizator składni, taki jak (lxml).

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

Ale jeśli nie określisz żadnego parsera jako parametru, otrzymasz ostrzeżenie, że żaden parser nie został określony.

soup_object= BeautifulSoup(markup) #Warnning

Aby użyć innego zewnętrznego analizatora składni, musisz go zainstalować, a następnie określić. lubić

pip install lxml

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

Zewnętrzny parser ma zależność c i python, co może mieć pewne zalety i wady.


3

Napotkałem ten sam problem. Znalazłem przyczynę tego, że miałem nieco nieaktualny pakiet Pythona Six.

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

Uaktualnienie sześciu pakietów rozwiąże problem:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
pyd

2

Zainstaluj parser LXML w środowisku python.

pip install lxml

Twój problem zostanie rozwiązany. Możesz także użyć wbudowanego pakietu python dla tego samego, co:

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

Uwaga: Nazwa modułu „HTMLParser” została zmieniona na „html.parser” w Python3


0

W niektórych odniesieniach użyj drugiego zamiast pierwszego:

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

Powinieneś podać nieco więcej szczegółów w swojej odpowiedzi
Michael

0

Błąd nadchodzi z powodu używanego analizatora składni. Ogólnie rzecz biorąc, jeśli masz plik / kod HTML, musisz go użyć html5lib(dokumentacja znajduje się tutaj ), aw przypadku, gdy masz plik / dane XML, musisz go użyć lxml(dokumentacja znajduje się tutaj ). Możesz także użyć lxmlpliku / kodu HTML, ale czasami daje to błąd jak wyżej. Lepiej więc wybrać pakiet mądrze w oparciu o typ danych / pliku. Możesz także użyć html_parserwbudowanego modułu. Ale to też czasem nie działa.

Aby uzyskać więcej informacji na temat tego, kiedy użyć pakietu, zobacz szczegóły tutaj


0

Pusty parametr spowoduje wyświetlenie ostrzeżenia o najlepszym dostępnym.
zupa = BeautifulSoup (html)

--------------- / UserWarning: Nie określono jawnie żadnego analizatora składni, więc używam najlepszego dostępnego analizatora składni HTML dla tego systemu („html5lib”). Zwykle nie stanowi to problemu, ale jeśli uruchomisz ten kod w innym systemie lub w innym środowisku wirtualnym, może on używać innego analizatora składni i zachowywać się inaczej .--------------- ------- /

python --wersja Python 3.7.7

PyCharm 19.3.4 CE

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.