Những ưu và nhược điểm của các trình phân tích cú pháp Java hàng đầu là gì? [đóng cửa]


175

Tìm kiếm SO và Google, tôi thấy rằng có một vài trình phân tích cú pháp Java HTML luôn được các bên khác nhau khuyến nghị. Thật không may, thật khó để tìm thấy bất kỳ thông tin nào về điểm mạnh và điểm yếu của các thư viện khác nhau. Tôi hy vọng rằng một số người đã dành một số so sánh các thư viện này và có thể chia sẻ những gì họ đã học được.

Đây là những gì tôi đã thấy:

Và nếu có một trình phân tích cú pháp chính mà tôi đã bỏ lỡ, tôi cũng rất muốn nghe về ưu và nhược điểm của nó.

Cảm ơn!

Câu trả lời:


223

Chung

Hầu như tất cả các trình phân tích cú pháp HTML đã biết đều triển khai API W3C DOM (một phần của API JAXP, API Java để xử lý XML) và cung cấp cho bạn một bản org.w3c.dom.Documentsao sẵn sàng để sử dụng trực tiếp bởi API JAXP. Sự khác biệt chính thường được tìm thấy trong các tính năng của trình phân tích cú pháp được đề cập. Hầu hết các trình phân tích cú pháp ở một mức độ nhất định tha thứ và khoan dung với HTML không được định dạng tốt ("tagsoup"), như JTidy , NekoHTML , TagSoupHtmlCleaner . Bạn thường sử dụng loại trình phân tích cú pháp HTML này để "dọn dẹp" nguồn HTML (ví dụ: thay thế hợp lệ HTML bằng hợp lệ <br>XML <br />), để bạn có thể duyệt qua "cách thông thường" bằng cách sử dụng API W3C DOM và JAXP.

Những người duy nhất nhảy ra là HtmlUnitJsoup .

HtmlUnit

HtmlUnit cung cấp API hoàn toàn riêng mang đến cho bạn khả năng hoạt động như một trình duyệt web theo chương trình. Tức là nhập giá trị biểu mẫu, nhấp vào các phần tử, gọi JavaScript, vân vân. Nó không chỉ đơn thuần là một trình phân tích cú pháp HTML. Đây là một "công cụ kiểm tra đơn vị web" không có GUI "và HTML thực sự.

Jsoup

Jsoup cũng cung cấp một API hoàn toàn riêng. Nó cung cấp cho bạn khả năng chọn các phần tử bằng cách sử dụng các bộ chọn CSS giống như jQuery và cung cấp API khéo léo để duyệt qua cây DOM HTML để có được các phần tử quan tâm.

Đặc biệt là việc duyệt qua cây HTML DOM là thế mạnh chính của Jsoup. Những người đã từng làm việc với họ org.w3c.dom.Documentbiết thế nào là đau đớn khi vượt qua DOM bằng cách sử dụng verbose NodeListNodeAPI. Đúng, XPathlàm cho cuộc sống dễ dàng hơn, nhưng vẫn là một đường cong học tập khác và cuối cùng nó có thể vẫn còn dài dòng.

Đây là một ví dụ sử dụng trình phân tích cú pháp W3C DOM "đơn giản" như JTidy kết hợp với XPath để trích đoạn đầu tiên của câu hỏi của bạn và tên của tất cả người trả lời (Tôi đang sử dụng XPath vì không có nó, mã cần thiết để thu thập thông tin quan tâm mặt khác sẽ lớn lên gấp 10 lần, mà không cần viết các phương thức tiện ích / trợ giúp).

String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
  
Node question = (Node) xpath.compile("//*[@id='question']//*[contains(@class,'post-text')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());

NodeList answerers = (NodeList) xpath.compile("//*[@id='answers']//*[contains(@class,'user-details')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
    System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}

Và đây là một ví dụ về cách thực hiện chính xác như vậy với Jsoup:

String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();

Element question = document.select("#question .post-text p").first();
System.out.println("Question: " + question.text());

Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
    System.out.println("Answerer: " + answerer.text());
}

Bạn có thấy sự khác biệt? Nó không chỉ ít mã hơn, mà Jsoup cũng tương đối dễ nắm bắt nếu bạn đã có kinh nghiệm vừa phải với các bộ chọn CSS (ví dụ: phát triển trang web và / hoặc sử dụng jQuery).

Tóm lược

Những ưu và nhược điểm của mỗi nên đủ rõ ràng bây giờ. Nếu bạn chỉ muốn sử dụng API JAXP tiêu chuẩn để duyệt qua nó, thì hãy tìm nhóm trình phân tích cú pháp được đề cập đầu tiên. Có khá nhiều trong số họ. Lựa chọn nào tùy thuộc vào các tính năng mà nó cung cấp (việc dọn dẹp HTML có dễ dàng với bạn không? Có một số trình nghe / chặn và trình dọn dẹp dành riêng cho thẻ không?) Và độ mạnh của thư viện (mức độ thường xuyên được cập nhật / bảo trì / sửa lỗi? ). Nếu bạn muốn đơn vị kiểm tra HTML, thì HtmlUnit là cách để đi. Nếu bạn muốn trích xuất dữ liệu cụ thể từ HTML (thường là yêu cầu trong thế giới thực), thì Jsoup là cách để đi.


Có một pro / con khổng lồ bị bỏ qua ở đây: Jericho là trình phân tích cú pháp duy nhất tôi biết cho phép bạn thao tác HTML khó chịu trong khi duy trì định dạng khoảng trắng và tính không chính xác của HTML (nếu có).
Adam Gent

3
Jsouptốt. Tôi đã cố gắng giao diện nó với một mô-đun khác hoạt động với org.w3c.dom.*API. Nhận thấy rằng Jsoup không tuân theo org.w3c.dom.*hợp đồng
Thamme Gowda

13

Bài viết này so sánh các khía cạnh nhất định của các trình phân tích cú pháp sau:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

Đây không phải là một bản tóm tắt hoàn chỉnh, và nó có từ năm 2008, nhưng bạn có thể thấy nó hữu ích.


Đây là một câu trả lời chỉ liên kết. Bạn có thể thêm các chi tiết thích hợp ở đây?
Tái lập lại Monica - notmaynard

7

Thêm Trình phân tích cú pháp HTML xác thực.nu , một triển khai thuật toán phân tích cú pháp HTML5 trong Java, vào danh sách của bạn.

Về mặt tích cực, nó được thiết kế đặc biệt để phù hợp với HTML5 và là trung tâm của trình xác thực HTML5, vì vậy rất có khả năng khớp hành vi phân tích cú pháp của trình duyệt trong tương lai với độ chính xác rất cao.

Về mặt trừ, không có phân tích cú pháp kế thừa nào của trình duyệt hoạt động chính xác như thế này và vì HTML5 vẫn còn trong dự thảo, có thể thay đổi.

Trong thực tế, các vấn đề như vậy chỉ ảnh hưởng đến các trường hợp góc tối và cho tất cả các mục đích thực tế, một trình phân tích cú pháp tuyệt vời.


7

Tôi thấy Jericho HTML Parser được viết rất tốt, luôn cập nhật (điều mà nhiều trình phân tích cú pháp không có), không phụ thuộc và dễ sử dụng.


6

Tôi sẽ chỉ thêm vào câu trả lời @MJB sau khi làm việc với hầu hết các thư viện phân tích cú pháp HTML trong Java, có một pro / con rất lớn bị bỏ qua: trình phân tích cú pháp bảo toàn định dạng và không chính xác của HTML trên đầu vào và đầu ra.

Đó là hầu hết các trình phân tích cú pháp khi bạn thay đổi tài liệu sẽ thổi bay khoảng trắng, nhận xét và tính không chính xác của DOM, đặc biệt nếu chúng là một thư viện giống như XML.

Jericho là trình phân tích cú pháp duy nhất mà tôi biết cho phép bạn thao tác HTML khó chịu trong khi duy trì định dạng khoảng trắng và tính không chính xác của HTML (nếu có).


3

Hai tùy chọn khác là HTMLCleanerHTMLParser .

Tôi đã thử hầu hết các trình phân tích cú pháp ở đây cho khung trích xuất dữ liệu / trình thu thập dữ liệu mà tôi đang phát triển. Tôi sử dụng HTMLCleaner cho phần lớn công việc trích xuất dữ liệu. Điều này là do nó hỗ trợ một phương ngữ hiện đại hợp lý của HTML, XHTML, HTML 5, với các không gian tên và nó hỗ trợ DOM, do đó có thể sử dụng nó với triển khai XPath được xây dựng trong Java .

Làm điều này với HTMLCleaner dễ dàng hơn nhiều so với một số trình phân tích cú pháp khác: ví dụ, JSoup hỗ trợ giao diện giống như DOM, thay vì DOM, do đó cần phải có một số lắp ráp . Jericho có giao diện SAX-line nên một lần nữa nó đòi hỏi một số công việc mặc dù Sujit Pal có một mô tả tốt về cách thực hiện việc này nhưng cuối cùng HTMLCleaner chỉ hoạt động tốt hơn.

Tôi cũng sử dụng HTMLParser và Jericho cho một tác vụ trích xuất bảng, thay thế một số mã được viết bằng libhtml-tableextract-perl của Perl . Tôi sử dụng HTMLParser để lọc HTML cho bảng, sau đó sử dụng Jericho để phân tích cú pháp. Tôi đồng ý với ý kiến ​​của MJB và Adam rằng Jericho tốt trong một số trường hợp vì nó bảo tồn HTML cơ bản. Nó có một loại giao diện SAX không chuẩn, vì vậy để xử lý XPath, HTMLCleaner sẽ tốt hơn.

Phân tích cú pháp HTML trong Java là một vấn đề khó khăn đáng ngạc nhiên vì tất cả các trình phân tích cú pháp dường như đấu tranh trên một số loại nội dung HTML không đúng định dạng.

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.