2014-06-25 10 views
59
... 
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 wyjścia na moim terminalu. Jestem na Mac OS 10.7.x. Mam Python 2.7.1, a następnie this tutorial, aby uzyskać Beautiful Soup i Lxml, które oba zostały pomyślnie zainstalowane i działają z osobnym plikiem testowym located here. W skrypcie Pythona, który powoduje ten błąd, mam włączone wiersz: from pageCrawler import comparePages iw pliku pageCrawler mam włączone następujące dwa wiersze: from bs4 import BeautifulSoup from urllib2 import urlopenbs4.FeatureNotFound: Nie można znaleźć konstruktora drzewa z żądanymi funkcjami: lxml. Czy musisz zainstalować bibliotekę analizatora składni?

Każda pomoc w zastanawianie się, na czym polega problem i jak może być rozwiązany, byłoby bardzo docenione.

+0

zobaczyć tę odpowiedź - http: // stacko verflow.com/questions/17766725/how-to-re-install-lxml –

+0

Czy "html" to adres URL lub zawartość html? –

Odpowiedz

53

Podejrzewam, że jest to powiązane z parserem, którego BS użyje do odczytania kodu HTML. One document it here, ale jeśli jesteś podobny do mnie (na OSX), możesz utknąć z czymś, co wymaga trochę pracy:

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

Jeśli robi to brzmi jak ból, można przełączyć się do parsera lxml:

pip install lxml 

a następnie spróbuj:

soup = BeautifulSoup(html, "lxml") 

W zależności od scenariusza, który może być wystarczająco dobre. Znalazłem to dość irytujące, by zagwarantować aktualizację mojej wersji Pythona. Korzystanie virtualenv, you can migrate your packages dość łatwo

+6

Dzięki, że teraz działa. Używam 'html5lib'. –

19

Dla podstawowy z pytona skrzynki z BS4 zainstalowanego następnie można przetworzyć xml z

soup = BeautifulSoup(html, "html5lib") 

Jeśli jednak chcesz używać formatyzatora = „xml” to trzeba to

pip3 install lxml 

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

Napotkałem ten sam problem. Znalazłem powód, dlaczego miałem nieco przestarzały pakiet sześciu pytonów.

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

Aktualizacja pakietu sześciu rozwiąże problem:

sudo pip install six=1.10.0 
+0

'sudo pip install six == 1.10.0' – pyd

6

wolałem wybudowany w python html parser, bez instalowania żadnych zależności BeautifulSoup zupa = (S, "html.parser")

+2

Dzięki, to działało na AWS Lambda. –

2

Nie można zainstalować biblioteki parserów na komputerze lub nie można jej znaleźć.

Spróbuj polecenie cmd:

pip install lxml

3

Używam Python 3.6 i miałem ten sam pierwotny błąd w tym poście. Po Pobiegłem polecenia:

python3 -m pip install lxml 

to rozwiązać mój problem

0

Zamiast użycia lxml html.parser, można użyć ten kawałek kodu:

soup = BeautifulSoup(html, 'html.parser') 
0

postanowiłem ten błąd przez modernizacji mój rozkład lxml:

pip install -U lxml