bs4.FeatureNotFound: Không thể tìm thấy trình tạo cây với các tính năng bạn yêu cầu: lxml. Bạn có cần cài đặt một thư viện phân tích cú pháp?


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?

Các đầu ra trên trên Terminal của tôi. Tôi đang dùng Mac OS 10.7.x. Tôi có Python 2.7.1 và đã làm theo hướng dẫn này để có được Beautiful Soup và lxml, cả hai đều được cài đặt thành công và hoạt động với một tệp thử nghiệm riêng biệt nằm ở đây . Trong tập lệnh Python gây ra lỗi này, tôi đã bao gồm dòng này: from pageCrawler import comparePages Và trong tệp pageCrawler tôi đã bao gồm hai dòng sau: from bs4 import BeautifulSoup from urllib2 import urlopen

Bất kỳ trợ giúp trong việc tìm ra vấn đề là gì và làm thế nào nó có thể được giải quyết sẽ được đánh giá cao.



htmlmột url hoặc một nội dung html?
tommy.carstensen

Câu trả lời:


227

Tôi có một nghi ngờ rằng điều này có liên quan đến trình phân tích cú pháp mà BS sẽ sử dụng để đọc HTML. Tài liệu của họ ở đây , nhưng nếu bạn giống tôi (trên OSX), bạn có thể bị mắc kẹt với thứ gì đó đòi hỏi một chút công việc:

Bạn sẽ nhận thấy rằng trong trang tài liệu BS4 ở trên, họ chỉ ra rằng theo mặc định BS4 sẽ sử dụng trình phân tích cú pháp HTML tích hợp Python. Giả sử bạn đang ở trong OSX, phiên bản Python được đóng gói của Apple là 2.7.2, không dễ dàng cho việc định dạng ký tự. Tôi gặp vấn đề tương tự, vì vậy tôi đã nâng cấp phiên bản Python của mình để khắc phục nó. Làm điều này trong một virtualenv sẽ giảm thiểu sự gián đoạn cho các dự án khác.

Nếu làm điều đó nghe có vẻ đau đớn, bạn có thể chuyển sang trình phân tích cú pháp LXML:

pip install lxml

Và sau đó thử:

soup = BeautifulSoup(html, "lxml")

Tùy thuộc vào kịch bản của bạn, điều đó có thể đủ tốt. Tôi thấy điều này đủ khó chịu để đảm bảo nâng cấp phiên bản Python của tôi. Sử dụng virtualenv, bạn có thể di chuyển các gói của mình khá dễ dàng.


1
Để kiểm tra sau khi cài đặt 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

trong env ảo của tôi, tôi cần thiết để cài đặt requests, bs4lxmltrước BeautifulSoupsẽ phân tích nội dung trang web của tôi.
noobninja

Uff! Mad Mac, tôi không biết khi nào tôi sẽ ngừng hối hận về quyết định mua Mac của mình!
Iqra.

48

Đối với python cơ bản với bs4 được cài đặt, sau đó bạn có thể xử lý xml của mình với

soup = BeautifulSoup(html, "html5lib")

Tuy nhiên, nếu bạn muốn sử dụng formatter = 'xml' thì bạn cần phải

pip3 install lxml

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

3
Trên một máy chủ từ xa mới xuất hiện, html5lib không hoạt động với tôi. Tôi vẫn phải làm một pip install html5lib, sau đó mọi thứ hoạt động tốt.
petercoles

Không làm việc cho tôi: bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?Nếu tôi thay đổi nó thành html.parserhoạt động
8bitjunkie

41

Tôi thích xây dựng trình phân tích cú pháp html python, không cài đặt không phụ thuộc

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


Nó hoạt động trong khi @Ernst trong khi trước đó không hoạt động. Cảm ơn!
adrCoder

14

Tôi đang sử dụng Python 3.6 và tôi đã có cùng một lỗi ban đầu trong bài viết này. Sau khi tôi chạy lệnh:

python3 -m pip install lxml

nó đã giải quyết vấn đề của tôi


Trong Docker, nó cũng cần thiếtapt install python-lxml
Walter

14

Chạy ba lệnh này để đảm bảo rằng bạn đã cài đặt tất cả các gói có liên quan:

pip install bs4
pip install html5lib
pip install lxml

Sau đó khởi động lại IDE Python của bạn, nếu cần.

Điều đó nên quan tâm đến bất cứ điều gì liên quan đến vấn đề này.


1
Đây là giải pháp thực tế.
John Stud

8

Thay vì sử dụng lxml, hãy sử dụng html.parser, bạn có thể sử dụng đoạn mã này:

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

Mặc dù BeautifulSoup hỗ trợ trình phân tích cú pháp HTML theo mặc định Nếu bạn muốn sử dụng bất kỳ trình phân tích cú pháp Python của bên thứ ba nào khác, bạn cần cài đặt trình phân tích cú pháp bên ngoài như (lxml).

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

Nhưng nếu bạn không chỉ định bất kỳ trình phân tích cú pháp nào làm tham số, bạn sẽ nhận được cảnh báo rằng không có trình phân tích cú pháp nào được chỉ định.

soup_object= BeautifulSoup(markup) #Warnning

Để sử dụng bất kỳ trình phân tích cú pháp bên ngoài nào khác, bạn cần cài đặt nó và sau đó cần chỉ định nó. giống

pip install lxml

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

Trình phân tích cú pháp bên ngoài có phụ thuộc c và python có thể có một số lợi thế và bất lợi.


3

Tôi gặp phải vấn đề tương tự. Tôi tìm thấy lý do là tôi đã có một gói sáu con trăn hơi lỗi thời.

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

Nâng cấp gói sáu của bạn sẽ giải quyết vấn đề:

sudo pip install six=1.10.0

sudo pip install six==1.10.0
pyd

2

Cài đặt trình phân tích cú pháp LXML trong môi trường python.

pip install lxml

Vấn đề của bạn sẽ được giải quyết. Bạn cũng có thể sử dụng gói python tích hợp cho giống như:

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

Lưu ý: Mô-đun "HTMLParser" đã được đổi tên thành "html.parser" trong Python3


0

Trong một số tài liệu tham khảo, sử dụng cái thứ hai thay vì cái thứ nhất:

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

Bạn nên cung cấp thêm một chút chi tiết trong câu trả lời của mình
Michael

0

Lỗi đang đến vì trình phân tích cú pháp bạn đang sử dụng. Nói chung, nếu bạn có tệp / mã HTML thì bạn cần sử dụng html5lib(có thể tìm thấy tài liệu ở đây ) & trong trường hợp bạn có tệp / dữ liệu XML thì bạn cần sử dụng lxml(có thể tìm thấy tài liệu ở đây ). Bạn cũng có thể sử dụng lxmlcho tệp / mã HTML nhưng đôi khi nó cũng báo lỗi như trên. Vì vậy, tốt hơn để chọn gói một cách khôn ngoan dựa trên loại dữ liệu / tệp. Bạn cũng có thể sử dụng html_parsermô-đun tích hợp. Nhưng, điều này đôi khi cũng không hoạt động.

Để biết thêm chi tiết về thời điểm sử dụng gói nào bạn có thể xem chi tiết tại đây


0

Tham số trống sẽ dẫn đến một cảnh báo cho tốt nhất có sẵn.
súp = BeautifulSoup (html)

--------------- / UserWarning: Không có trình phân tích cú pháp nào được chỉ định rõ ràng, vì vậy tôi đang sử dụng trình phân tích cú pháp HTML tốt nhất có sẵn cho hệ thống này ("html5lib"). Điều này thường không phải là vấn đề, nhưng nếu bạn chạy mã này trên một hệ thống khác hoặc trong một môi trường ảo khác, nó có thể sử dụng một trình phân tích cú pháp khác và hành xử khác nhau .--------------- ------- /

trăn - đảo ngược Python 3.7.7

PyCharm 19.3.4 CE

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.