2008-11-13 26 views
23

Trong .Net, tôi đã tìm thấy thư viện tuyệt vời này, HtmlAgilityPack cho phép bạn dễ dàng phân tích cú pháp HTML không được định dạng bằng XPath. Tôi đã sử dụng điều này trong một vài năm trong các trang web .Net của tôi, nhưng tôi đã phải giải quyết cho các thư viện đau đớn hơn cho Python, Ruby và các dự án khác. Có ai biết về các thư viện tương tự cho các ngôn ngữ khác không?Phân tích HTML qua XPath

Trả lời

6

Trong python, ElementTidy phân tích súp thẻ và tạo ra một cây yếu tố, cho phép truy vấn sử dụng XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB 
>>> tb = TB() 
>>> tb.feed("<p>Hello world") 
>>> e= tb.close() 
>>> e.find(".//{http://www.w3.org/1999/xhtml}p") 
<Element {http://www.w3.org/1999/xhtml}p at 264eb8> 
+1

Bạn có thể muốn xem xét lxml cho Python bây giờ –

+8

** Nguy hiểm!** Sử dụng trình phân tích cú pháp BeautifulSoup cho lxml thay vì elementtidy sẽ sặc trên các không gian tên không được khai báo. Tôi đã học thật chăm chỉ! –

5

BeautifulSoup là thư viện Python tốt để xử lý HTML lộn xộn theo những cách rõ ràng.

+13

BeautifulSoup không sử dụng xpath :) – dzen

3

Dường như câu hỏi có thể được tuyên bố chính xác hơn là "Cách chuyển đổi HTML sang XML để biểu thức XPath có thể được đánh giá dựa trên nó".

Dưới đây là hai công cụ tốt:

  1. TagSoup, một chương trình mã nguồn mở, là một Java và SAX - công cụ dựa, được phát triển bởi John Cowan. Đây là trình phân tích cú pháp tuân thủ SAX được viết bằng Java, thay vì phân tích cú pháp XML được định dạng hoặc hợp lệ, phân tích HTML như được tìm thấy trong tự nhiên: nghèo, khó chịu và thô lỗ, mặc dù khá ngắn. TagSoup được thiết kế cho những người phải xử lý nội dung này bằng cách sử dụng một số khía cạnh của một thiết kế ứng dụng hợp lý. Bằng cách cung cấp một giao diện SAX, nó cho phép các công cụ XML tiêu chuẩn được áp dụng cho ngay cả HTML tồi tệ nhất. TagSoup cũng bao gồm một bộ xử lý dòng lệnh đọc các tệp HTML và có thể tạo ra HTML thuần hoặc XML được định dạng tốt, gần đúng với XHTML.
    Taggle là một cổng C++ thương mại của TagSoup.

  2. SgmlReader là công cụ được phát triển bởi Microsoft Chris Lovett.
    SgmlReader là một API XmlReader trên bất kỳ tài liệu SGML nào (bao gồm cả hỗ trợ HTML). Một tiện ích dòng lệnh cũng được cung cấp để xuất kết quả XML được định dạng tốt.
    Tải file zip bao gồm thực thi độc lập và toàn bộ mã nguồn: SgmlReader.zip

1

Một thành tích xuất sắc được the pure XSLT 2.0 Parser of HTML được viết bởi David Carlisle.

Đọc mã của nó sẽ là một bài tập học tập tuyệt vời cho tất cả mọi người trong chúng ta.

Từ mô tả:

"d: htmlparse (string)
  d: htmlparse (string, namespace, html-mode)

    Một hình thức lập luận tương đương với)
    d: htmlparse (string, 'http://ww.w3.org/1999/xhtml', true()))

    phân tích các chuỗi dưới dạng HTML và/hoặc XML sử dụng một số công nghệ tự động sẵn có để)
    kiểm soát việc mở và đóng phần tử ngụ ý.

    Nó không có đủ kiến ​​thức về HTML DTD nhưng lai có danh sách đầy đủ của
    phần tử rỗng và danh sách đầy đủ các định nghĩa thực thể.Các thực thể HTML, và
    tham chiếu ký tự thập phân và thập lục phân đều được chấp nhận. Lưu ý html-entity
    được nhận diện ngay cả khi html-mode = false().

tên     phần tử được lowercased (nếu html-mode là đúng()) và đặt vào không gian tên
    định bởi tham số không gian tên (có thể là "" để biểu thị
    không gian tên trừ khi đầu vào đã explict tờ khai gian tên, trong
    trường hợp này sẽ được tôn trọng.

    tên thuộc tính được lowercased nếu html-mode = true()
"

Đọc mô tả chi tiết hơn here.

Hy vọng điều này sẽ hữu ích.

Chúc mừng,

Dimitre Novatchev.

2

Đối với Ruby, tôi đánh giá cao đề nghị Hpricot mà Jb Evain đã chỉ ra. Nếu bạn đang tìm kiếm một đối thủ cạnh tranh dựa trên libxml nhanh hơn, Nokogiri (xem http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/) cũng khá tốt (nó hỗ trợ cả tìm kiếm XPath và CSS như Hpricot nhưng nhanh hơn). Có một số cơ bản wiki và một số benchmarks.

+1

Tôi rất muốn khuyên [Nokogiri] (http: // nokogiri. org) những ngày này. Đó là tất cả mọi thứ Hpricot đã và nhiều hơn nữa. –

1

Có một triển khai C miễn phí cho XML được gọi là libxml2 có một số bit api cho XPath mà tôi đã sử dụng với thành công lớn mà bạn có thể chỉ định HTML là tài liệu đang được tải. Điều này đã làm việc cho tôi đối với một số tài liệu HTML hoàn hảo hơn ..

Đối với hầu hết các phần, XPath hữu ích nhất khi HTML vào được mã hóa chính xác và có thể đọc 'như tài liệu xml'. Bạn có thể muốn xem xét sử dụng một tiện ích dành riêng cho mục đích này để làm sạch tài liệu HTML. Dưới đây là một ví dụ: http://tidy.sourceforge.net/

Theo như các công cụ XPath này, bạn có thể thấy rằng hầu hết các triển khai thực sự dựa trên các thư viện C hoặc C++ đã có từ trước như libxml2.

41

Tôi ngạc nhiên không có một đề cập duy nhất của lxml. Nó rất nhanh và sẽ hoạt động trong bất kỳ môi trường nào cho phép thư viện CPython.

Đây là cách you can parse HTML via XPATH using lxml.

>>> from lxml import etree 
>>> doc = '<foo><bar></bar></foo>' 
>>> tree = etree.HTML(doc) 

>>> r = tree.xpath('/foo/bar') 
>>> len(r) 
1 
>>> r[0].tag 
'bar' 

>>> r = tree.xpath('bar') 
>>> r[0].tag 
'bar' 
+1

Chết tiệt, đây là một câu hỏi cũ: -/ –

+8

Không có nghĩa là bạn có thể trả lời câu hỏi đó. Lý tưởng nhất, câu trả lời tốt nhất bong bóng lên ngay cả sau một thời gian rất dài. Nhân tiện, câu trả lời của bạn chỉ phân tích cú pháp XML chứ không phải HTML. Bạn nên bao gồm một cá thể 'HTMLParser'. – phihag

+1

phihag: Đã sửa lỗi. Làm việc với HTML quá bây giờ, miễn là doc chứa văn bản chúng tôi muốn phân tích cú pháp. –

5

Kết quả ổn định nhất mà tôi đã sử dụng lxml.html của soupparser. Bạn sẽ cần phải cài đặt python-lxml và python-BeautifulSoup, sau đó bạn có thể làm như sau:

Các vấn đề liên quan