bs4.FeatureNotFound: Não foi possível encontrar um construtor de árvores com os recursos que você solicitou: lxml. Você precisa instalar uma biblioteca analisadora?


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?

As saídas acima no meu terminal. Estou no Mac OS 10.7.x. Eu tenho o Python 2.7.1 e segui este tutorial para obter Beautiful Soup e lxml, que foram instalados com sucesso e funcionam com um arquivo de teste separado localizado aqui . No script Python que causa esse erro, incluí esta linha: from pageCrawler import comparePages E no arquivo pageCrawler, incluí as duas linhas a seguir: from bs4 import BeautifulSoup from urllib2 import urlopen

Qualquer ajuda para descobrir qual é o problema e como ele pode ser resolvido seria muito apreciada.



É htmlum URL ou um conteúdo HTML?
tommy.carstensen

Respostas:


227

Suspeito que isso esteja relacionado ao analisador que o BS usará para ler o HTML. O documento está aqui , mas se você é como eu (no OSX), pode estar preso a algo que requer um pouco de trabalho:

Você notará que, na página de documentação do BS4 acima, eles apontam que, por padrão, o BS4 usará o analisador HTML incorporado do Python. Supondo que você esteja no OSX, a versão do Python incluída na Apple é a 2.7.2, que não é branda para a formatação de caracteres. Eu encontrei esse mesmo problema, então atualizei minha versão do Python para contornar isso. Fazer isso em um virtualenv minimizará interrupções em outros projetos.

Se isso soa como uma dor, você pode mudar para o analisador LXML:

pip install lxml

E então tente:

soup = BeautifulSoup(html, "lxml")

Dependendo do seu cenário, isso pode ser bom o suficiente. Achei isso irritante o suficiente para garantir a atualização da minha versão do Python. Usando o virtualenv, você pode migrar seus pacotes com bastante facilidade.


1
Para testar após a instalação do 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

no meu ambiente virtual, eu precisava instalar requests, bs4e lxmlantes BeautifulSoupanalisava o conteúdo da minha página da web.
noobninja

Uff! Mad Mac, não sei quando vou parar de me arrepender da minha decisão de comprar o Mac!
Iqra.

48

Para python básico pronto para uso com o bs4 instalado, você pode processar seu xml com

soup = BeautifulSoup(html, "html5lib")

Se, no entanto, você quiser usar formatter = 'xml' , precisará

pip3 install lxml

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

3
Em um servidor remoto recém-criado, o html5lib não funcionou imediatamente para mim. Eu ainda tinha que fazer um pip install html5lib, após o qual tudo funcionou bem.
petercoles

Não funcionou para mim: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?se eu mudar para html.parserele funciona
8bitjunkie

41

Eu preferi o analisador python html, sem instalação, sem dependências

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


Funciona enquanto @Ernst enquanto o anterior não funcionou. Obrigado!
AdrCoder

14

Estou usando o Python 3.6 e tive o mesmo erro original neste post. Depois de executar o comando:

python3 -m pip install lxml

resolveu meu problema


No Docker também é necessárioapt install python-lxml
Walter

14

Execute estes três comandos para garantir que todos os pacotes relevantes estejam instalados:

pip install bs4
pip install html5lib
pip install lxml

Em seguida, reinicie o IDE do Python, se necessário.

Isso deve cuidar de qualquer coisa relacionada a esse problema.


1
Esta é a solução real.
John Stud

8

Em vez de usar o lxml, use html.parser, você pode usar este trecho de código:

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

Embora o BeautifulSoup suporte o analisador HTML por padrão Se você quiser usar outros analisadores Python de terceiros, precisará instalar esse analisador externo como (lxml).

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

Mas se você não especificou nenhum analisador como parâmetro, receberá um aviso de que nenhum analisador foi especificado.

soup_object= BeautifulSoup(markup) #Warnning

Para usar qualquer outro analisador externo, é necessário instalá-lo e depois especificá-lo. gostar

pip install lxml

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

O analisador externo tem dependência de c e python, o que pode ter algumas vantagens e desvantagens.


3

Eu encontrei o mesmo problema. Descobri que o motivo era que eu tinha um pacote python six ligeiramente desatualizado.

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

A atualização do seu pacote de seis resolverá o problema:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
Python #

2

Instale o analisador LXML no ambiente python.

pip install lxml

Seu problema será resolvido. Você também pode usar o pacote python interno para o mesmo que:

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

Nota: O módulo "HTMLParser" foi renomeado para "html.parser" no Python3


0

Em algumas referências, use o segundo em vez do primeiro:

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

Você deve fornecer um pouco mais detalhadamente em sua resposta
Michael

0

O erro está ocorrendo devido ao analisador que você está usando. Em geral, se você tiver um arquivo / código HTML, precisará usá-lo html5lib(a documentação pode ser encontrada aqui ) e, caso tenha um arquivo / dados XML, será necessário usá-lo lxml(a documentação pode ser encontrada aqui ). Você também pode usar o lxmlcódigo / arquivo HTML, mas às vezes isso gera um erro como acima. Portanto, é melhor escolher o pacote com sabedoria, com base no tipo de dados / arquivo. Você também pode usar o html_parsermódulo incorporado. Mas, isso também às vezes não funciona.

Para mais detalhes sobre quando usar qual pacote, você pode ver os detalhes aqui


0

O parâmetro em branco resultará em um aviso para a melhor disponibilidade.
sopa = sopa bonita (html)

--------------- / UserWarning: nenhum analisador foi especificado explicitamente; portanto, estou usando o melhor analisador HTML disponível para este sistema ("html5lib"). Isso geralmente não é um problema, mas se você executar esse código em outro sistema ou em um ambiente virtual diferente, ele poderá usar um analisador diferente e se comportar de maneira diferente. ------- /

python - versão Python 3.7.7

PyCharm 19.3.4 CE

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.