Allgemeines
Fast alle bekannten HTML-Parser implementieren die W3C-DOM-API (Teil der JAXP-API, Java-API für die XML-Verarbeitung) und bieten Ihnen eine org.w3c.dom.Document
Rückseite, die für die direkte Verwendung durch die JAXP-API bereit ist. Die Hauptunterschiede liegen normalerweise in den Funktionen des betreffenden Parsers. Die meisten Parser sind bis zu einem gewissen Grad verzeihend und nachsichtig mit nicht gut geformtem HTML ("tagsoup"), wie JTidy , NekoHTML , TagSoup und HtmlCleaner . Normalerweise verwenden Sie diese Art von HTML-Parsern, um die HTML-Quelle zu "bereinigen" (z. B. indem Sie die HTML-gültige <br>
durch eine XML-gültige ersetzen <br />
), damit Sie sie mit der W3C-DOM- und JAXP-API "auf die übliche Weise" durchlaufen können.
Die einzigen, die herausspringen, sind HtmlUnit und Jsoup .
HtmlUnit
HtmlUnit bietet eine vollständig eigene API, mit der Sie sich programmgesteuert wie ein Webbrowser verhalten können . Dh Formularwerte eingeben, auf Elemente klicken, JavaScript aufrufen usw. Es ist viel mehr als nur ein HTML-Parser. Es ist ein echtes "GUI-less Webbrowser" und HTML-Unit-Test-Tool.
Jsoup
Jsoup bietet auch eine vollständig eigene API. Es gibt Ihnen die Möglichkeit, Elemente mit jQuery- ähnlichen CSS-Selektoren auszuwählen, und bietet eine übersichtliche API zum Durchlaufen des HTML-DOM-Baums, um die gewünschten Elemente abzurufen.
Insbesondere das Durchlaufen des HTML-DOM-Baums ist die Hauptstärke von Jsoup. Diejenigen, die mit gearbeitet haben, org.w3c.dom.Document
wissen, wie schmerzhaft es ist, das DOM mithilfe der ausführlichen NodeList
und Node
APIs zu durchlaufen . Es stimmt, XPath
macht das Leben einfacher, aber es ist eine weitere Lernkurve und es kann immer noch ausführlich sein.
Hier ist ein Beispiel, das einen "einfachen" W3C-DOM-Parser wie JTidy in Kombination mit XPath verwendet, um den ersten Absatz Ihrer Frage und die Namen aller Antwortenden zu extrahieren (ich verwende XPath, da ohne diesen Code der Code benötigt wird, um die interessierenden Informationen zu sammeln würde sonst 10-mal so groß werden, ohne Utility- / Helfer-Methoden zu schreiben).
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());
}
Und hier ist ein Beispiel, wie man mit Jsoup genau dasselbe macht:
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());
}
Sehen Sie den Unterschied? Es ist nicht nur weniger Code, sondern Jsoup ist auch relativ einfach zu verstehen, wenn Sie bereits mäßige Erfahrung mit CSS-Selektoren haben (z. B. durch Entwickeln von Websites und / oder Verwenden von jQuery).
Zusammenfassung
Die Vor- und Nachteile eines jeden sollten jetzt klar genug sein. Wenn Sie nur die Standard-JAXP-API zum Durchlaufen verwenden möchten, wählen Sie die erstgenannte Gruppe von Parsern. Es gibt ziemlich viele von ihnen. Welche Sie auswählen müssen, hängt von den Funktionen ab (wie wird Ihnen die HTML-Bereinigung erleichtert? Gibt es einige Listener / Interceptors und tag-spezifische Bereiniger?) Und von der Robustheit der Bibliothek (wie oft wird sie aktualisiert / gewartet / repariert?). ). Wenn Sie den HTML-Code testen möchten, ist HtmlUnit der richtige Weg. Wenn Sie bestimmte Daten aus dem HTML-Code extrahieren möchten (was mehr als häufig die Anforderungen der realen Welt sind), ist Jsoup der richtige Weg.