bs4.FeatureNotFound: İstediğiniz özelliklere sahip bir ağaç oluşturucu bulunamadı: lxml. Ayrıştırıcı kitaplığı yüklemeniz mi gerekiyor?


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?

Yukarıdaki çıkışlar Terminalimde. Mac OS 10.7.x kullanıyorum. Python 2.7.1 var ve her ikisi de başarıyla yüklenen ve burada bulunan ayrı bir test dosyası ile çalışan Güzel Çorba ve lxml, almak için bu öğretici takip etti . Bu hataya neden olan Python komut dosyasında bu satırı ekledim : Ve pageCrawler dosyasında aşağıdaki iki satırı ekledim: from pageCrawler import comparePagesfrom bs4 import BeautifulSoup from urllib2 import urlopen

Sorunun ne olduğunu ve nasıl çözülebileceğini belirlemede yapılacak herhangi bir yardım çok takdir edilecektir.



htmlbir URL veya html içeriği?
tommy.carstensen

Yanıtlar:


227

Bunun BS'nin HTML'yi okumak için kullanacağı ayrıştırıcıyla ilgili olduğundan şüphe duyuyorum. Onlar belge burada , ama sen bana (OSX'te) gibi iseniz biraz iş gerektiren bir şey ile sıkışmış olabilir:

Yukarıdaki BS4 belgeleri sayfasında, BS4'ün varsayılan olarak Python yerleşik HTML ayrıştırıcısını kullanacağına dikkat çekeceklerini göreceksiniz. OSX'te olduğunuzu varsayarsak, Python'un Apple ile birlikte gelen sürümü 2.7.2'dir ve bu da karakter biçimlendirmesine izin vermez. Aynı sorunu vurdum, bu yüzden Python sürümümü bu sorunu çözmek için yükselttim. Bunu bir sanal ortamda yapmak, diğer projelerin bozulmasını en aza indirecektir.

Bunu yapmak bir acı gibi geliyorsa, LXML ayrıştırıcısına geçebilirsiniz:

pip install lxml

Ve sonra deneyin:

soup = BeautifulSoup(html, "lxml")

Senaryonuza bağlı olarak, bu yeterince iyi olabilir. Python sürümümü yükseltmeyi garanti edecek kadar can sıkıcı buldum. Virtualenv kullanarak, paketlerinizi oldukça kolay bir şekilde taşıyabilirsiniz .


1
Pip kurulumundan sonra test etmek için:python -c 'import requests ; from bs4 import BeautifulSoup ; r = requests.get("https://www.allrecipes.com/recipes/96/salad/") ; soup = BeautifulSoup(r.text, "lxml") '
ViFI

Benim sanal env'deki, ben yüklemek için gereken requests, bs4ve lxmldaha önce BeautifulSoupbenim web sayfası içeriğini ayrıştırmak olacaktır.
noobninja

Uff! Deli Mac, Mac satın alma kararımdan ne zaman pişman olacağımı bilmiyorum!
Iqra.

48

Kutusundan çıkan temelde bs4 yüklü python için xml'nizi

soup = BeautifulSoup(html, "html5lib")

Ancak formatter = 'xml' kullanmak istiyorsanız,

pip3 install lxml

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

3
Yeni açılan bir uzak sunucuda, html5lib benim için kutudan çıkmadı. Hala yapmak zorunda kaldım pip install html5lib, bundan sonra her şey yolunda gitti.
petercoles

Benim için çalışmadı: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?Eğer bunu değiştirirsem html.parserçalışır
8bitjunkie

41

Ben yerleşik python html ayrıştırıcı tercih, hiçbir bağımlılık yüklemek

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


Bir önceki işe yaramazken @Ernst iken çalışır. Teşekkürler!
adrCoder

14

Python 3.6 kullanıyorum ve bu yazı aynı orijinal hata vardı. Komutu çalıştırdıktan sonra:

python3 -m pip install lxml

sorunumu çözdü


Docker'da bu da gereklidirapt install python-lxml
Walter

14

İlgili tüm paketlerin kurulu olduğundan emin olmak için bu üç komutu çalıştırın:

pip install bs4
pip install html5lib
pip install lxml

Ardından gerekirse Python IDE'nizi yeniden başlatın.

Bu konuyla ilgili her şeyi halletmelidir.


1
Gerçek çözüm budur.
John Stud

8

Lxml kullanmak yerine html.parser yerine şu kod parçasını kullanabilirsiniz:

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

BeautifulSoup varsayılan olarak HTML ayrıştırıcısını desteklese de, başka bir üçüncü taraf Python ayrıştırıcısı kullanmak istiyorsanız, o harici ayrıştırıcıyı (lxml) gibi yüklemeniz gerekir.

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

Ancak parametre olarak herhangi bir ayrıştırıcı belirtmediyseniz, ayrıştırıcı belirtilmediğine dair bir uyarı alırsınız.

soup_object= BeautifulSoup(markup) #Warnning

Başka bir harici ayrıştırıcıyı kullanmak için kurmanız ve daha sonra belirtmeniz gerekir. sevmek

pip install lxml

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

Harici ayrıştırıcı, bazı avantaj ve dezavantajlara sahip olabilecek c ve python bağımlılığına sahiptir.


3

Aynı sorunla karşılaştım. Nedenini biraz eski python altı paketi vardı bulundu.

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

Altı paketinizi yükseltmek sorunu çözecektir:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
pyd

2

LXML ayrıştırıcısını python ortamına yükleyin.

pip install lxml

Sorununuz çözülecek. Ayrıca aşağıdakiler için yerleşik python paketini de kullanabilirsiniz:

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

Not: "HTMLParser" modülü Python3'te "html.parser" olarak yeniden adlandırılmıştır


0

Bazı referanslarda, birincisi yerine ikincisini kullanın:

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

Cevabınızda biraz daha ayrıntılı bilgi vermelisiniz
Michael

0

Hata, kullandığınız ayrıştırıcı nedeniyle geliyor. Genel olarak, HTML dosyanız / kodunuz varsa kullanmanız gerekir html5lib(dokümantasyon burada bulunabilir ) ve durumda XML dosya / verileriniz varsa kullanmanız gerekir lxml(dokümantasyon burada bulunabilir ). lxmlHTML dosyası / kodu için de kullanabilirsiniz , ancak bazen yukarıdaki gibi bir hata verir. Bu nedenle, veri / dosya türüne göre paketi akıllıca seçmek daha iyidir. html_parserDahili modülü de kullanabilirsiniz . Ancak, bu bazen işe yaramaz.

Hangi paketin ne zaman kullanılacağına ilişkin daha fazla ayrıntı için ayrıntıları burada görebilirsiniz


0

Blank parametresi, mevcut en iyi seçenek için bir uyarı ile sonuçlanır.
çorba = BeautifulSoup (html)

--------------- / UserWarning: Hiçbir ayrıştırıcı açıkça belirtilmedi, bu yüzden bu sistem için en iyi HTML ayrıştırıcısını kullanıyorum ("html5lib"). Bu genellikle sorun değildir, ancak bu kodu başka bir sistemde veya farklı bir sanal ortamda çalıştırırsanız, farklı bir ayrıştırıcı kullanabilir ve farklı davranabilir .--------------- ------- /

python - sürüm Python 3.7.7

PyCharm 19.3.4 CE

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.