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.

user3773048
fonte
É 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.

James Errico
fonte
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")
Tim Seed
fonte
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")

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

Bashar
fonte
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.

Pikamander2
fonte
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')
Yogesh
fonte
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.

Projesh Bhoumik
fonte
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
Qiao Yang
fonte
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

Shankar Vishnu
fonte
0

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

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
abhishekPakrashi
fonte
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

Pranav Bhendawade
fonte
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

user176105
fonte