bs4.FeatureNotFound: Не вдалося знайти конструктора дерев із необхідними функціями: lxml. Вам потрібно встановити бібліотеку аналізатора?


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?

Вищевказані результати на моєму терміналі. Я на Mac OS 10.7.x. У мене є Python 2.7.1, і я дотримувався цього підручника, щоб отримати Beautiful Soup та lxml, які успішно встановлені та працюють з окремим тестовим файлом, розміщеним тут . У сценарій Python, який викликає цю помилку, я включив цей рядок: from pageCrawler import comparePages І у файл pageCrawler я включив наступні два рядки: from bs4 import BeautifulSoup from urllib2 import urlopen

Буде дуже вдячна будь-яка допомога у з'ясуванні проблеми, яка є проблемою та як її можна вирішити.



Це htmlвміст URL або HTML?
tommy.carstensen

Відповіді:


227

У мене є підозра, що це пов'язано з аналізатором, який BS використовуватиме для читання HTML. Вони документують тут , але якщо ти схожий на мене (на OSX), ти можеш застрягти в чомусь, що вимагає трохи роботи:

Ви помітите, що на сторінці документації BS4 вище, вони вказують, що BS4 за замовчуванням використовуватиме вбудований HTML-аналізатор Python. Якщо припустити, що ви перебуваєте в OSX, версія Apple Python в пакеті 2.7.2 не є поблажливою для форматування символів. Я потрапив у цю ж проблему, тому я оновив свою версію Python, щоб обійти її. Виконання цього в virtualenv мінімізує зрив інших проектів.

Якщо це звучить як біль, ви можете перейти на аналізатор LXML:

pip install lxml

А потім спробуйте:

soup = BeautifulSoup(html, "lxml")

Залежно від сценарію, це може бути досить добре. Мені це було досить прикро, що вимагає оновлення моєї версії Python. Використовуючи virtualenv, ви можете мігрувати ваші пакунки досить легко.


1
Для тестування після встановлення 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

в моїй віртуальній окр, мені потрібно встановити requests, bs4і , lxmlперш ніж BeautifulSoupбуде розібрати моє утримання веб - сторінки.
noobninja

Uff! Mad Mac, я не знаю, коли я перестану шкодувати про своє рішення про купівлю Mac!
Ікра.

48

Для базового встановленого пітону з встановленим bs4 ви можете обробити ваш xml

soup = BeautifulSoup(html, "html5lib")

Якщо ви хочете використовувати formatter = 'xml', вам це потрібно

pip3 install lxml

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

3
На нещодавно запущеному віддаленому сервері html5lib мені не вийшов. Мені все-таки довелося зробити pip install html5lib, після чого все спрацювало нормально.
петерколі

Не працювало для мене: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?якщо я зміню його на html.parserце, працює
8bitjunkie

41

Я вважав за краще вбудований в Python html-аналізатор, не встановлювати ніяких залежностей

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


Він працює в той час, як @Ernst, поки попередній не працював. Дякую!
adrCoder

14

Я використовую Python 3.6, і в цій публікації у мене була така ж оригінальна помилка. Після запуску команди:

python3 -m pip install lxml

це вирішило мою проблему


У Докері теж потрібноapt install python-lxml
Вальтер

14

Запустіть ці три команди, щоб переконатися, що у вас встановлені всі відповідні пакети:

pip install bs4
pip install html5lib
pip install lxml

Потім перезавантажте свій Python IDE, якщо потрібно.

Це повинно піклуватися про все, що стосується цього питання.


1
Це власне рішення.
Джон Студ

8

Замість використання lxml використання html.parser, ви можете використовувати цей фрагмент коду:

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

Хоча BeautifulSoup за замовчуванням підтримує HTML-аналізатор. Якщо ви хочете використовувати будь-які інші сторонні аналізатори Python, вам потрібно встановити такий зовнішній аналізатор, як (lxml).

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

Але якщо ви не вказали будь-який аналізатор як параметр, ви отримаєте попередження про те, що не визначений аналізатор.

soup_object= BeautifulSoup(markup) #Warnning

Для використання будь-якого іншого зовнішнього аналізатора вам потрібно встановити його, а потім вказати його. подібно до

pip install lxml

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

Зовнішній синтаксичний аналізатор має залежність c і python, що може мати певну перевагу та недолік.


3

Я зіткнувся з тим же питанням. Я знайшов причину в тому, що у мене був трохи застарілий пакет пітона шість.

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

Оновлення шести пакетів вирішить проблему:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
під

2

Встановіть LXML-аналізатор в середовищі python.

pip install lxml

Ваша проблема буде вирішена. Ви також можете використовувати вбудований пакет python для того ж, що:

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

Примітка: Модуль "HTMLParser" був перейменований на "html.parser" в Python3


0

У деяких посиланнях використовуйте друге замість першого:

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

Надайте трохи детальніше у своїй відповіді
Майкл

0

Помилка відбувається через аналізатор, який ви використовуєте. Загалом, якщо у вас є файл / код HTML, тоді вам потрібно скористатися html5lib(документацію можна знайти тут ), і якщо у вас є XML-файл / дані, тоді вам потрібно скористатися lxml(документацію можна знайти тут ). Ви також можете використовувати lxmlдля файлу / коду HTML, але іноді він дає помилку, як зазначено вище. Отже, краще вибирати пакет розумно, виходячи з типу даних / файлу. Ви також можете використовувати html_parserвбудований модуль. Але це теж іноді не спрацьовує.

Більш детальну інформацію про те, коли використовувати пакет, ви можете переглянути тут


0

Порожній параметр призведе до попередження для найкращих доступних.
суп = BeautifulSoup (html)

--------------- / UserWarning: Жоден аналізатор явно не вказаний, тому я використовую найкращий доступний HTML-аналізатор для цієї системи ("html5lib"). Зазвичай це не проблема, але якщо ви запускаєте цей код в іншій системі або в іншому віртуальному середовищі, він може використовувати інший аналізатор і поводитись по-різному .--------------- ------- /

python --версія Python 3.7.7

PyCharm 19.3.4 н.е.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.