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 BeautifulSoupfrom 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" до того, как начали работать. Вот что я сделал:


  1. Перейдите в Файл -> Настройки
  2. Выберите «Интерпретатор Python» в левой строке меню настроек, выберите «Интерпретатор Python».
  3. Щелкните значок «+» над списком пакетов.
  4. Найдите «lxml».
  5. Нажмите «Установить пакет» в левом нижнем углу окна «Доступный пакет».

Мое решение состояло в том, чтобы удалить lxmlиз conda и переустановив его с помощью pip.

conda install lxml 

работал для меня из виртуальной среды.
Это было на Windows 10.

  1. python -m pip install lxml (в cmd)

  2. Импортировать lxml (в вашем коде / проекте)

Этот метод работал для меня. Я предпочитаю упомянуть, что я пробовал это в виртуальной среде. Первый:

      pip install --upgrade bs4

Во-вторых, я использовал:

      html.parser

вместо

      html5lib
Другие вопросы по тегам