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

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

Любая помощь в выяснении, в чем заключается проблема и как ее можно решить, будет высоко ценится.

user3773048
источник
1
см. этот ответ - stackoverflow.com/questions/17766725/how-to-re-install-lxml
Md. Mohsin
Является ли htmlURL - адрес или а содержимое HTML?
tommy.carstensen

Ответы:

227

У меня есть подозрение, что это связано с анализатором, который BS будет использовать для чтения HTML. Они документируют здесь , но если вы похожи на меня (на OSX), вы можете застревать с чем-то, что требует немного работы:

Вы заметите, что на странице документации BS4 выше они указывают, что по умолчанию BS4 будет использовать встроенный анализатор Python HTML. Предполагая, что вы находитесь в OSX, версия Python для Apple является 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
Уфф! Безумный Mac, я не знаю, когда перестану сожалеть о своем решении купить Mac!
Икра.
48

Для основного готового Python с установленным bs4 вы можете обработать ваш XML с

soup = BeautifulSoup(html, "html5lib")

Однако, если вы хотите использовать formatter = 'xml', вам нужно

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
Тим Сид
источник
3
На недавно запущенном удаленном сервере html5lib не работал для меня из коробки. Мне все еще нужно было сделать pip install html5lib, после чего все работало нормально.
petercoles
Не работает для меня: 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
44

Я предпочел встроенный синтаксический анализатор Python, нет установки, никаких зависимостей

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

Эрнст
источник
Работает, пока @Ernst пока предыдущий не работал. Спасибо!
adrCoder
14

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

python3 -m pip install lxml

это решило мою проблему

Башар
источник
В Docker также необходимоapt install python-lxml
Уолтер
14

Запустите эти три команды, чтобы убедиться, что у вас установлены все соответствующие пакеты:

pip install bs4
pip install html5lib
pip install lxml

Затем перезапустите вашу Python IDE, если это необходимо.

Это должно заботиться обо всем, что связано с этой проблемой.

Pikamander2
источник
1
Это актуальное решение.
Джон Стад
8

Вместо использования lxml используйте html.parser, вы можете использовать этот фрагмент кода:

soup = BeautifulSoup(html, 'html.parser')
Yogesh
источник
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

Я столкнулся с той же проблемой. Я обнаружил, что причина в том, что у меня был слегка устаревший пакет python шесть.

>>> 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')
abhishekPakrashi
источник
Вы должны предоставить немного больше подробностей в своем ответе
Майкл
0

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

Более подробную информацию о том, когда использовать какой пакет вы можете увидеть здесь.

Пранав Бхендаваде
источник
0

Пустой параметр приведет к предупреждению для лучшего из доступных.
суп = BeautifulSoup (HTML)

--------------- / UserWarning: синтаксический анализатор не был указан явно, поэтому я использую лучший доступный анализатор HTML для этой системы ("html5lib"). Обычно это не проблема, но если вы запускаете этот код в другой системе или в другой виртуальной среде, он может использовать другой анализатор и вести себя по-другому .--------------- ------- /

Python - версия Python 3.7.7

PyCharm 19.3.4 CE

user176105
источник