Umum
Hampir semua parser HTML yang dikenal mengimplementasikan W3C DOM API (bagian dari JAXP API, Java API untuk pemrosesan XML) dan memberi Anda org.w3c.dom.Document
punggung yang siap digunakan langsung oleh JAXP API. Perbedaan utama biasanya ditemukan dalam fitur parser yang bersangkutan. Sebagian besar parser sampai tingkat tertentu memaafkan dan lunak dengan HTML yang tidak berformat baik ("tagoup"), seperti JTidy , NekoHTML , TagSoup dan HtmlCleaner . Anda biasanya menggunakan parser HTML semacam ini untuk "merapikan" sumber HTML (misalnya mengganti HTML-valid <br>
dengan XML-valid<br />
), sehingga Anda dapat melewatinya "dengan cara biasa" menggunakan W3C DOM dan JAXP API.
Satu-satunya yang melompat keluar adalah HtmlUnit dan Jsoup .
HtmlUnit
HtmlUnit menyediakan API sepenuhnya milik Anda yang memberi Anda kemungkinan untuk bertindak seperti browser web secara terprogram. Yaitu memasukkan nilai formulir, klik elemen, aktifkan JavaScript, dan sebagainya. Ini jauh lebih dari seorang parser HTML saja. Ini adalah "penjelajah web tanpa GUI" yang nyata dan alat pengujian unit HTML.
Jsoup
Jsoup juga menyediakan API yang sepenuhnya miliknya. Ini memberi Anda kemungkinan untuk memilih elemen menggunakan pemilih CSS seperti jQuery dan menyediakan API yang apik untuk melintasi pohon DOM HTML untuk mendapatkan elemen yang menarik.
Khususnya melintasi pohon HTML DOM adalah kekuatan utama Jsoup. Orang yang telah bekerja dengan org.w3c.dom.Document
tahu betapa sakitnya untuk melintasi DOM menggunakan verbose NodeList
dan Node
API. Benar,XPath
membuat hidup lebih mudah, tapi tetap saja, itu adalah kurva belajar yang lain dan bisa berakhir dengan kata lain.
Berikut adalah contoh yang menggunakan parser DOM W3C "biasa" seperti JTidy yang dikombinasikan dengan XPath untuk mengekstrak paragraf pertama dari pertanyaan Anda dan nama-nama semua penjawab (saya menggunakan XPath karena tanpa itu, kode yang diperlukan untuk mengumpulkan informasi yang menarik) jika tidak akan tumbuh 10 kali lebih besar, tanpa menulis utilitas / metode pembantu).
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());
}
Dan inilah contoh bagaimana melakukan hal yang persis sama dengan 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());
}
Apakah Anda melihat perbedaannya? Ini bukan hanya kode yang lebih sedikit, tetapi Jsoup juga relatif mudah dipahami jika Anda sudah memiliki pengalaman moderat dengan pemilih CSS (misalnya mengembangkan situs web dan / atau menggunakan jQuery).
Ringkasan
Pro dan kontra masing-masing harus cukup jelas sekarang. Jika Anda hanya ingin menggunakan API JAXP standar untuk melewatinya, maka pergi untuk grup parser yang disebutkan pertama. Ada cukup banyak dari mereka. Yang mana yang akan dipilih tergantung pada fitur yang disediakannya (bagaimana pembersihan HTML dipermudah untuk Anda? Apakah ada beberapa pendengar / pencegat dan pembersih khusus-tag?) Dan kekokohan perpustakaan (seberapa sering diperbarui / dirawat / diperbaiki? ). Jika Anda ingin menguji unit HTML, maka HtmlUnit adalah cara untuk melakukannya. Jika Anda suka mengekstraksi data spesifik dari HTML (yang seringkali merupakan persyaratan dunia nyata), maka Jsoup adalah cara untuk melakukannya.