bs4.FeatureNotFound: Tidak dapat menemukan pembuat pohon dengan fitur yang Anda minta: lxml. Apakah Anda perlu menginstal parser library?

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?

Output di atas pada Terminal saya. Saya di Mac OS 10.7.x. Saya memiliki Python 2.7.1, dan mengikuti tutorial ini untuk mendapatkan Beautiful Soup dan lxml, yang keduanya berhasil diinstal dan bekerja dengan file tes terpisah yang terletak di sini . Dalam skrip Python yang menyebabkan kesalahan ini, saya telah menyertakan baris ini: from pageCrawler import comparePages Dan dalam file pageCrawler saya telah menyertakan dua baris berikut: from bs4 import BeautifulSoup from urllib2 import urlopen

Setiap bantuan dalam mencari tahu apa masalahnya dan bagaimana cara memecahkannya akan sangat dihargai.

pengguna3773048
sumber
Apakah htmlurl atau isinya html?
tommy.carstensen

Jawaban:

227

Saya curiga ini terkait dengan parser yang akan digunakan BS untuk membaca HTML. Mereka mendokumentasikan ada di sini , tetapi jika Anda seperti saya (di OSX), Anda mungkin akan terjebak dengan sesuatu yang membutuhkan sedikit kerja:

Anda akan melihat bahwa pada halaman dokumentasi BS4 di atas, mereka menunjukkan bahwa secara default BS4 akan menggunakan parser HTML bawaan Python. Dengan asumsi Anda menggunakan OSX, versi Python yang dibundel Apple adalah 2.7.2 yang tidak lunak untuk pemformatan karakter. Saya mengalami masalah yang sama, jadi saya memutakhirkan versi Python saya untuk mengatasinya. Melakukan ini dalam virtualenv akan meminimalkan gangguan pada proyek lain.

Jika melakukan itu terdengar seperti rasa sakit, Anda dapat beralih ke pengurai LXML:

pip install lxml

Dan kemudian coba:

soup = BeautifulSoup(html, "lxml")

Tergantung pada skenario Anda, itu mungkin cukup baik. Saya menemukan ini cukup menjengkelkan untuk menjamin peningkatan versi Python saya. Dengan menggunakan virtualenv, Anda dapat memigrasi paket Anda dengan cukup mudah.

James Errico
sumber
1
Untuk menguji setelah menginstal 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
di virtual env saya, saya perlu menginstal requests, bs4dan lxmlsebelum BeautifulSoupmem-parsing konten halaman web saya.
noobninja
Uff! Mad Mac, saya tidak tahu kapan saya akan berhenti menyesali keputusan saya membeli Mac!
Iqra.
48

Untuk dasar dari kotak python dengan bs4 diinstal maka Anda dapat memproses xml Anda dengan

soup = BeautifulSoup(html, "html5lib")

Namun jika Anda ingin menggunakan formatter = 'xml' maka Anda perlu melakukannya

pip3 install lxml

soup = BeautifulSoup(html, features="xml")
Benih Tim
sumber
3
Di server jarak jauh yang baru diputar, html5lib tidak berfungsi untuk saya. Saya masih harus melakukan pip install html5lib, setelah semuanya bekerja dengan baik.
petercoles
Tidak bekerja untuk saya: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?Jika saya mengubahnya html.parserberfungsi
8bitjunkie
41

Saya lebih suka dibangun di python html parser, tidak menginstal tidak ada dependensi

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

Ernst
sumber
Ini berfungsi saat @Ernst sedangkan yang sebelumnya tidak berfungsi. Terima kasih!
adrCoder
14

Saya menggunakan Python 3.6 dan saya memiliki kesalahan asli yang sama dalam posting ini. Setelah saya menjalankan perintah:

python3 -m pip install lxml

itu menyelesaikan masalah saya

Bashar
sumber
Di Docker juga perlu apt install python-lxml
Walter
14

Jalankan ketiga perintah ini untuk memastikan Anda telah menginstal semua paket yang relevan:

pip install bs4
pip install html5lib
pip install lxml

Kemudian restart IDE Python Anda, jika perlu.

Itu harus mengurus apa pun yang berkaitan dengan masalah ini.

Pikamander2
sumber
1
Ini solusi sebenarnya.
John Stud
8

Alih-alih menggunakan lxml gunakan html.parser, Anda dapat menggunakan kode ini:

soup = BeautifulSoup(html, 'html.parser')
Yogesh
sumber
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

Meskipun BeautifulSoup mendukung parser HTML secara default. Jika Anda ingin menggunakan parser Python pihak ketiga lainnya, Anda harus menginstal parser eksternal seperti (lxml).

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

Tetapi jika Anda tidak menentukan parser sebagai parameter, Anda akan mendapatkan peringatan bahwa tidak ada parser yang ditentukan.

soup_object= BeautifulSoup(markup) #Warnning

Untuk menggunakan parser eksternal lainnya, Anda harus menginstalnya dan kemudian perlu menentukannya. Suka

pip install lxml

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

Parser eksternal memiliki ketergantungan c dan python yang mungkin memiliki beberapa kelebihan dan kekurangan.

Projesh Bhoumik
sumber
3

Saya mengalami masalah yang sama. Saya menemukan alasannya adalah bahwa saya memiliki paket python enam yang agak ketinggalan jaman.

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

Memutakhirkan enam paket Anda akan menyelesaikan masalah:

sudo pip install six=1.10.0
Qiao Yang
sumber
sudo pip install six==1.10.0
pyd
2

Instal parser LXML di lingkungan python.

pip install lxml

Masalah Anda akan teratasi. Anda juga dapat menggunakan paket python bawaan untuk sama seperti:

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

Catatan: Modul "HTMLParser" telah diubah namanya menjadi "html.parser" di Python3

Shankar Wisnu
sumber
0

Dalam beberapa referensi, gunakan yang kedua alih-alih yang pertama:

soup_object= BeautifulSoup(markup,'html-parser')
soup_object= BeautifulSoup(markup,'html.parser')
abhishek Pokhara
sumber
Anda harus memberikan sedikit lebih detail dalam jawaban Anda
Michael
0

Kesalahan terjadi karena parser yang Anda gunakan. Secara umum, jika Anda memiliki file / kode HTML maka Anda perlu menggunakan html5lib(dokumentasi dapat ditemukan di sini ) & jika Anda memiliki file XML / data maka Anda perlu menggunakan lxml(dokumentasi dapat ditemukan di sini ). Anda dapat menggunakan lxmlfile / kode HTML juga tetapi kadang-kadang memberikan kesalahan seperti di atas. Jadi, lebih baik memilih paket secara bijak berdasarkan jenis data / file. Anda juga bisa menggunakanhtml_parser modul bawaan. Tapi, ini juga kadang tidak berhasil.

Untuk detail lebih lanjut mengenai kapan menggunakan paket mana Anda bisa melihat detailnya di sini

Pranav Bhendawade
sumber
0

Parameter kosong akan menghasilkan peringatan untuk yang terbaik tersedia.
sup = BeautifulSoup (html)

--------------- / UserWarning: Tidak ada parser yang ditentukan secara eksplisit, jadi saya menggunakan parser HTML terbaik yang tersedia untuk sistem ini ("html5lib"). Ini biasanya bukan masalah, tetapi jika Anda menjalankan kode ini di sistem lain, atau di lingkungan virtual yang berbeda, ini mungkin menggunakan parser yang berbeda dan berperilaku berbeda .--------------- ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

pengguna176105
sumber