bs4.FeatureNotFound: ไม่พบ tree Builder ที่มีคุณสมบัติที่คุณต้องการ: lxml คุณต้องการติดตั้งไลบรารี parser หรือไม่?


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?

ผลลัพธ์ข้างต้นบนเทอร์มินัลของฉัน ฉันใช้ Mac OS 10.7.x ฉันมีงูหลาม 2.7.1 และตามการกวดวิชานี้จะได้รับสวยซุปและ lxml ซึ่งทั้งสองประสบความสำเร็จในการติดตั้งและการทำงานกับไฟล์ทดสอบแยกต่างหากตั้งอยู่ที่นี่ ในสคริปต์ Python ที่ทำให้เกิดข้อผิดพลาดนี้ฉันได้รวมบรรทัดนี้ไว้: from pageCrawler import comparePages และในไฟล์ pageCrawler ฉันได้รวมสองบรรทัดต่อไปนี้: from bs4 import BeautifulSoup from urllib2 import urlopen

ความช่วยเหลือใด ๆ ในการหาว่าปัญหาคืออะไรและจะแก้ไขได้อย่างไรจะได้รับการชื่นชมมาก



คือhtmlURL ที่หรือเนื้อหา HTML หรือไม่
tommy.carstensen

คำตอบ:


227

ฉันสงสัยว่านี่เกี่ยวข้องกับตัวแยกวิเคราะห์ที่ BS จะใช้ในการอ่าน HTML พวกเขาเอกสารอยู่ที่นี่แต่ถ้าคุณชอบฉัน (ใน OSX) คุณอาจจะติดอยู่กับสิ่งที่ต้องบิตของการทำงาน:

คุณจะสังเกตเห็นว่าในหน้าเอกสารคู่มือ BS4 ด้านบนพวกเขาชี้ให้เห็นว่าตามค่าเริ่มต้น BS4 จะใช้ตัวแยกวิเคราะห์ HTML ใน Python สมมติว่าคุณอยู่ใน OSX, Python เวอร์ชันรวมของ Apple คือ 2.7.2 ซึ่งไม่ผ่อนปรนสำหรับการจัดรูปแบบอักขระ ฉันพบปัญหาเดียวกันนี้ดังนั้นฉันจึงอัพเกรด Python ให้เป็นเวอร์ชั่นที่ใช้งานได้ การทำสิ่งนี้ใน virtualenv จะลดการหยุดชะงักของโครงการอื่น ๆ

หากการทำเช่นนั้นดูเหมือนความเจ็บปวดคุณสามารถสลับไปใช้ตัวแยกวิเคราะห์ LXML:

pip install lxml

จากนั้นลอง:

soup = BeautifulSoup(html, "lxml")

ขึ้นอยู่กับสถานการณ์ของคุณว่าอาจจะดีพอ ฉันพบว่ามันน่ารำคาญพอที่จะรับประกันการอัพเกรด Python ของฉัน ใช้ virtualenv คุณสามารถโยกย้ายแพ็คเกจของคุณได้อย่างง่ายดาย


1
วิธีทดสอบหลังจากติดตั้ง 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

ใน env เสมือนของฉันฉันจำเป็นในการติดตั้งrequests, bs4และlxmlก่อนที่BeautifulSoupจะแยกเนื้อหาของหน้าเว็บของฉัน
noobninja

uff! Mad Mac ฉันไม่รู้เมื่อฉันจะหยุดเสียใจกับการตัดสินใจซื้อ Mac!
Iqra

48

สำหรับการใช้งานพื้นฐานของงูหลามกล่องที่ติดตั้ง bs4 คุณสามารถประมวลผล xml ของคุณ

soup = BeautifulSoup(html, "html5lib")

อย่างไรก็ตามหากคุณต้องการใช้formatter = 'xml'คุณจำเป็นต้องใช้

pip3 install lxml

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

3
บนเซิร์ฟเวอร์รีโมตที่เพิ่งหมุนใหม่ html5lib ไม่ทำงานให้ฉัน ฉันยังคงต้องทำpip install html5libหลังจากนั้นทุกอย่างทำงานได้ดี
เตอร์

ไม่ได้ผลสำหรับฉัน: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?ถ้าฉันเปลี่ยนให้html.parserใช้งานได้
8bitjunkie

41

ฉันชอบตัว parser html python ในตัวไม่มีการติดตั้งไม่ต้องพึ่งพา

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


มันทำงานในขณะที่ @Ernst ในขณะที่ก่อนหน้านี้ไม่ทำงาน ขอบคุณ!
adrCoder

14

ฉันใช้Python 3.6และฉันมีข้อผิดพลาดเดิมในโพสต์นี้ หลังจากที่ฉันรันคำสั่ง:

python3 -m pip install lxml

มันแก้ไขปัญหาของฉัน


ใน Docker มันก็จำเป็นที่จะต้องapt install python-lxml
วอลเตอร์

14

เรียกใช้คำสั่งทั้งสามนี้เพื่อให้แน่ใจว่าคุณได้ติดตั้งแพ็คเกจที่เกี่ยวข้องทั้งหมดแล้ว:

pip install bs4
pip install html5lib
pip install lxml

จากนั้นรีสตาร์ท Python IDE ของคุณหากจำเป็น

ที่ควรดูแลสิ่งที่เกี่ยวข้องกับปัญหานี้


1
นี่คือทางออกที่แท้จริง
John Stud

8

แทนที่จะใช้ lxml ให้ใช้ html.parser คุณสามารถใช้รหัสนี้ได้:

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 รองรับ HTML parser เป็นค่าเริ่มต้นหากคุณต้องการใช้ Parsers Python บุคคลที่สามอื่น ๆ คุณต้องติดตั้ง parser ภายนอกเช่น (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 ซึ่งอาจมีข้อได้เปรียบและเสียเปรียบ


3

ฉันพบปัญหาเดียวกัน ฉันพบสาเหตุคือฉันมีแพ็กเกจหลามล้าสมัยเล็กน้อย

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

sudo pip install six==1.10.0
pyd

2

ติดตั้งตัวแยกวิเคราะห์ LXML ในสภาพแวดล้อมหลาม

pip install lxml

ปัญหาของคุณจะได้รับการแก้ไข คุณสามารถใช้แพคเกจหลามในตัวเช่นเดียวกับ:

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

หมายเหตุ: โมดูล "HTMLParser" ได้ถูกเปลี่ยนชื่อเป็น "html.parser" ใน Python3


0

ในการอ้างอิงบางอย่างใช้ที่สองแทนการอ้างอิงแรก:

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

คุณควรให้รายละเอียดเพิ่มเติมเล็กน้อยในคำตอบของคุณ
Michael

0

ข้อผิดพลาดเกิดขึ้นเนื่องจาก parser ที่คุณใช้อยู่ โดยทั่วไปหากคุณมีไฟล์ / รหัส HTML คุณจำเป็นต้องใช้html5lib(สามารถดูเอกสารประกอบได้ที่นี่ ) และในกรณีที่คุณมีไฟล์ / ข้อมูล XML คุณจำเป็นต้องใช้lxml(เอกสารสามารถพบได้ที่นี่ ) คุณสามารถใช้lxmlสำหรับไฟล์ HTML / รหัสได้ แต่บางครั้งมันก็มีข้อผิดพลาดดังกล่าวข้างต้น ดังนั้นดีกว่าที่จะเลือกแพคเกจอย่างชาญฉลาดขึ้นอยู่กับประเภทของข้อมูล / ไฟล์ คุณยังสามารถใช้html_parserซึ่งเป็นโมดูลในตัว แต่บางครั้งก็ใช้งานไม่ได้เช่นกัน

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเวลาที่จะใช้แพ็คเกจที่คุณสามารถดูรายละเอียดได้ที่นี่


0

พารามิเตอร์เปล่าจะส่งผลให้มีคำเตือนให้ใช้งานได้ดีที่สุด
soup = BeautifulSoup (html)

--------------- / UserWarning: ไม่มีการแยกวิเคราะห์อย่างชัดเจนดังนั้นฉันจึงใช้ตัวแยกวิเคราะห์ HTML ที่ดีที่สุดสำหรับระบบนี้ ("html5lib") สิ่งนี้มักจะไม่เป็นปัญหา แต่ถ้าคุณเรียกใช้รหัสนี้ในระบบอื่นหรือในสภาพแวดล้อมเสมือนจริงอาจใช้ parser ที่แตกต่างกันและทำงานแตกต่างกัน ------- /

python --version Python 3.7.7

PyCharm 19.3.4 CE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.