bs4.FeatureNotFound: Не удалось найти конструктор дерева с запрошенными функциями: lxml. Вам нужно установить библиотеку парсера?
...
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
Любая помощь в выяснении, в чем заключается проблема и как ее можно решить, будет высоко ценится.
26 ответов
У меня есть подозрение, что это связано с анализатором, который 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, вы можете довольно легко перенести ваши пакеты.
Я предпочел встроенный синтаксический анализатор python html, без установки без зависимостей суп = BeautifulSoup(s, "html.parser")
Для основного готового Python с установленным bs4 вы можете обработать ваш XML с
soup = BeautifulSoup(html, "html5lib")
Однако, если вы хотите использовать formatter='xml', вам нужно
pip3 install lxml
soup = BeautifulSoup(html, features="xml")
Выполните эти три команды, чтобы убедиться, что у вас установлены все соответствующие пакеты:
pip install bs4
pip install html5lib
pip install lxml
Затем, при необходимости, перезапустите Python IDE.
Это должно позаботиться обо всем, что связано с этой проблемой.
Собственно 3 варианта упомянутых других работают.
1.
soup_object= BeautifulSoup(markup,"html.parser") #Python HTML parser
pip install lxml
soup_object= BeautifulSoup(markup,'lxml') # C dependent parser
pip install html5lib
soup_object= BeautifulSoup(markup,'html5lib') # C dependent parser
Я использую Python 3.6, и у меня была та же самая оригинальная ошибка в этом посте. После того, как я запустил команду:
python3 -m pip install lxml
это решило мою проблему
Установите парсер LXML в среде Python.
pip install lxml
Ваша проблема будет решена. Вы также можете использовать встроенный пакет Python для того же:
soup = BeautifulSoup(s, "html.parser")
Примечание. Модуль "HTMLParser" был переименован в "html.parser" в Python3.
Вместо использования lxml используйте html.parser, вы можете использовать этот фрагмент кода:
soup = BeautifulSoup(html, 'html.parser')
Хотя 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, что может иметь некоторые преимущества и недостатки.
pip install lxml
затем сохраняяxml
вsoup = BeautifulSoup(URL, "xml")
сделал работу на Mac.
В моем случае у меня была устаревшая версия
lxml
упаковка. Поэтому я просто обновил его, и это решило проблему.
sudo python3 -m pip install lxml --upgrade
Я столкнулся с той же проблемой. Я обнаружил, что причина в том, что у меня был слегка устаревший пакет 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
Библиотека парсера не установлена на вашем компьютере или не найдена.
Попробуйте эту команду из cmd:
pip install lxml
Я решил эту ошибку, обновив свой дистрибутив lxml:
pip install -U lxml
BS4 по умолчанию ожидает HTML-документ. Поэтому XML-документ анализируется как HTML-документ. Проходитьfeatures="xml"
как аргумент в конструкторе. Это решило мою проблему.
В некоторых ссылках используйте второе вместо первого:
soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
Вы можете перепроверить, что используете правильный интерпретатор, если у вас установлено несколько версий Python.
Как только я выбрал правильную версию Python, lxml был найден.
Ошибка возникает из-за используемого парсера. В общем, если у вас есть файл / код HTML, вам необходимо использоватьhtml5lib
(документацию можно найти здесь) и, если у вас есть файл / данные XML, вам необходимо использоватьlxml
(документацию можно найти здесь). Вы можете использоватьlxml
для файла / кода HTML также, но иногда он дает ошибку, как указано выше. Итак, лучше выбирать пакет с умом, исходя из типа данных / файла. Вы также можете использоватьhtml_parser
который является встроенным модулем. Но это тоже иногда не работает.
Для получения дополнительной информации о том, когда использовать какой пакет, вы можете увидеть подробности здесь
Пустой параметр приведет к предупреждению о наилучших возможностях.
soup = BeautifulSoup(HTML)
--------------- / UserWarning: синтаксический анализатор не был указан явно, поэтому я использую лучший доступный анализатор HTML для этой системы ("html5lib"). Обычно это не проблема, но если вы запустите этот код в другой системе или в другой виртуальной среде, он может использовать другой синтаксический анализатор и вести себя по-другому.--------------- ------- /
python - версия Python 3.7.7
PyCharm 19.3.4 CE
Важно для пользователей Jupyternotebook: если вы решите использовать парсер lxml, обязательно перезапустите ядро jupyternotebook после его установки с помощьюpip install lxml
. В противном случае парсер невозможно найти, поскольку он еще не инициализирован должным образом. Перезапустить ядро можно через графический интерфейс jupyternotebook web/pycharm/vscode.
Я исправил с изменениями ниже
До изменений
soup = BeautifulSoup(r.content, 'html5lib' )
print (soup.prettify())
После изменения
soup = BeautifulSoup(r.content, features='html')
print(soup.prettify())
мой код работает правильно
Я использую Python 3.8 в pycharm. Я предполагаю, что вы не установили "lxml" до того, как начали работать. Вот что я сделал:
- Перейдите в Файл -> Настройки
- Выберите «Интерпретатор Python» в левой строке меню настроек, выберите «Интерпретатор Python».
- Щелкните значок «+» над списком пакетов.
- Найдите «lxml».
- Нажмите «Установить пакет» в левом нижнем углу окна «Доступный пакет».
Мое решение состояло в том, чтобы удалить
lxml
из conda и переустановив его с помощью pip.
conda install lxml
работал для меня из виртуальной среды.
Это было на Windows 10.
python -m pip install lxml
(в cmd)Импортировать
lxml
(в вашем коде / проекте)
Этот метод работал для меня. Я предпочитаю упомянуть, что я пробовал это в виртуальной среде. Первый:
pip install --upgrade bs4
Во-вторых, я использовал:
html.parser
вместо
html5lib