2009-01-19 24 views
12

Có một trình phân tích cú pháp/thư viện có thể đọc tài liệu HTML vào cây DOM bằng Java không? Tôi muốn sử dụng API tiêu chuẩn DOM/Xpath mà Java cung cấp.Đọc tệp HTML tới cây DOM bằng cách sử dụng Java

Hầu hết các thư viện dường như có API tùy chỉnh để giải quyết tác vụ này. Hơn nữa, HTML chuyển đổi thành XML-DOM dường như không được hỗ trợ bởi hầu hết các trình phân tích cú pháp có sẵn.

Bất kỳ ý tưởng hoặc trải nghiệm nào với trình phân tích cú pháp HTML HTML tốt?

Trả lời

6

JTidy, hoặc bằng cách xử lý luồng thành XHTML sau đó sử dụng triển khai DOM yêu thích của bạn để phân tích lại hoặc sử dụng parseDOM nếu giới hạn DOM imp cung cấp cho bạn là đủ.

Cách khác Neko.

+0

Neko + Xerces thực hiện công việc khá tốt. Cảm ơn tất cả các câu trả lời –

+1

Hãy coi chừng JTidy. Nó có một lỗi rò rỉ bộ nhớ.Nếu bạn chạy nó trong một hệ thống sản xuất thì cuối cùng nó sẽ nổ tung - StackOverflowError và cuối cùng là OutOfMemoryError. Điều đó nói rằng, nó là tuyệt vời tốt lúc sửa chữa html bị hỏng để bạn có thể ăn nó vào một phân tích cú pháp dom. – Joel

+0

Có cách nào tốt để sử dụng JTidy làm giao diện người dùng cho JDOM hoặc XOM theo kiểu truyền trực tiếp không? Đó là, mà không đọc toàn bộ tài liệu vào bộ nhớ đầu tiên? (Và không sử dụng PipedInput/OutputStream và nhiều chủ đề?) Hoặc tôi sẽ tốt hơn hết chỉ bằng cách sử dụng Neko trong trường hợp đó? –

-1

Apache's Xerces2 parser nên làm những gì bạn muốn.

+3

Xerces rất nghiêm ngặt trong việc xác thực làm cho nó không phù hợp để đọc các trang HTML thế giới thực. –

1

TagSoup có thể làm những gì bạn muốn.

3

Vì các tệp HTML thường có vấn đề, trước tiên bạn cần dọn dẹp chúng bằng trình phân tích cú pháp/máy quét. Tôi đã sử dụng JTidy nhưng không bao giờ vui vẻ. NekoHTML hoạt động tốt, nhưng bất kỳ công cụ nào trong số này luôn luôn chỉ là một dự đoán tốt nhất về những gì được dự định. Bạn có hiệu quả yêu cầu để cho một chương trình thay đổi đánh dấu của tài liệu cho đến khi nó phù hợp với một lược đồ. Điều đó có thể sẽ gây ra kết cấu (đánh dấu), kiểu hoặc mất nội dung. Nó là không thể tránh khỏi, và bạn sẽ không thực sự biết những gì còn thiếu, trừ khi bạn quét bằng tay thông qua một trình duyệt (và sau đó bạn phải tin tưởng trình duyệt quá).

Nó thực sự phụ thuộc vào mục đích của bạn — nếu bạn có hàng nghìn tài liệu xấu với hàng tấn không liên quan (không phải HTML), thì quy trình thủ công có thể không hợp lý. Nếu mục tiêu của bạn là chính xác trên một vài tài liệu quan trọng, thì việc khắc phục thủ công chúng là một đề xuất hợp lý.

Một cách tiếp cận là quy trình thủ công liên tục chuyển nguồn qua trình phân tích cú pháp được xác định và/hoặc xác thực, trong một chu kỳ chỉnh sửa bằng cách sử dụng các thông báo lỗi để cuối cùng sửa chữa đánh dấu bị hỏng. Điều này đòi hỏi một số hiểu biết về XML, nhưng đó không phải là một giáo dục xấu để thực hiện.

Với Java 5 các tính năng XML cần thiết — được gọi là API JAXP — hiện được tích hợp vào chính Java; bạn không cần bất kỳ thư viện bên ngoài nào.

Lần đầu tiên bạn có được một thể hiện của một DocumentBuilderFactory, thiết lập các tính năng của nó, tạo một DocumentBuilder (trình phân tích cú pháp), sau đó gọi phương thức parse() của nó với một InputSource. InputSource có một số nhà thầu có thể, với một StringReader được sử dụng trong ví dụ sau:

import javax.xml.parsers.*; 
// ... 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setValidating(false); 
dbf.setNamespaceAware(true); 
dbf.setIgnoringComments(false); 
dbf.setIgnoringElementContentWhitespace(false); 
dbf.setExpandEntityReferences(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
return db.parse(new InputSource(new StringReader(source))); 

Điều này trả về một tài liệu DOM. Nếu bạn không nhớ sử dụng các thư viện bên ngoài thì cũng có các API JDOM và XOM, và trong khi chúng có một số ưu điểm so với SAX và các API DOM trong JAXP, chúng yêu cầu phải thêm các thư viện không phải Java. DOM có thể hơi cồng kềnh, nhưng sau nhiều năm sử dụng nó, tôi không thực sự bận tâm nữa.

+0

Tôi đã sử dụng JAXP rộng rãi với XML nhưng tôi không tìm thấy bằng cách sử dụng JAXP rất hữu ích cho HTML, ngay cả sau khi vô hiệu hóa xác thực hoặc thực hiện các bước còn lại mà bạn đã đề xuất. Nhưng có lẽ HTML mà tôi đang cố phân tích quá xa là XHTML hợp lệ. – spaaarky21

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