Général
Presque tous connu les analyseurs HTML met en œuvre le W3C API DOM (partie de l'API JAXP, Java API for XML processing) et vous donne un org.w3c.dom.Document
de retour, prêt à être utilisé directement par l'API JAXP. Les principales différences sont que l'on retrouve habituellement dans les fonctionnalités de l'analyseur en question. La plupart des analyseurs sont à un certain degré de pardonner et indulgent avec les non-bien-formé HTML ("tagsoup"), comme JTidy, NekoHTML, TagSoup et HtmlCleaner. Vous utilisez habituellement ce genre de parseurs HTML "rangé" le code source HTML (par exemple, le remplacement du HTML valide <br>
par un XML valide <br />
), de sorte que vous pouvez parcourir "de la manière habituelle" en utilisant le DOM du W3C et de l'API JAXP.
Les seuls qui saute sont interface htmlunit et Jsoup.
Interface htmlunit
Interface htmlunit offre une API qui vous donne la possibilité d'agir comme un webbrowser par programmation. I. e. entrez les valeurs d'un formulaire, cliquez sur les éléments, invoquer JavaScript, etcetera. C'est beaucoup plus que seul un analyseur HTML. C'est un véritable "GUI-moins webbrowser" et HTML unité de l'outil de test.
Jsoup
Jsoup fournit également un complètement propre API. Il vous donne la possibilité de sélectionner des éléments à l'aide de jQuery-comme les sélecteurs CSS et fournit une nappe d'API pour parcourir le DOM HTML arbre pour obtenir les éléments d'intérêt.
En particulier la traversée de la DOM HTML arbre est l'atout majeur de Jsoup. Ceux qui ont travaillé avec org.w3c.dom.Document
savent ce qu'est un enfer de douleurs, il est de traverser le DOM à l'aide de la verbose NodeList
et Node
Api. Vrai, XPath
rend la vie plus facile, mais encore, c'est une autre courbe d'apprentissage, et il peut encore être détaillé.
Voici un exemple qui utilise une "plaine" du W3C DOM parser comme JTidy en combinaison avec XPath pour extraire le premier paragraphe de votre question et les noms de tous les answerers (je suis à l'aide de XPath car, sans lui, le code nécessaire à la collecte de l'information d'intérêt seraient autrement croître jusqu'à 10 fois plus gros, sans l'écriture utilitaire/méthodes d'aide).
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());
}
Et voici un exemple de comment le faire exactement la même chose avec 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());
}
Voyez-vous la différence? Il est non seulement moins de code, mais Jsoup est aussi relativement facile à saisir si vous avez déjà une expérience moyenne avec les sélecteurs CSS (par ex: développement de sites web et/ou à l'aide de jQuery).
Résumé
Les avantages et les inconvénients de chacun doit être assez clair maintenant. Si vous voulez juste utiliser la norme API JAXP de la traverser, puis aller pour la première fois mentionné groupe d'analyseurs. Il y a assez beaucoup d'entre eux. Lequel choisir dépend des fonctionnalités qu'il offre (comment est HTML nettoyage facile pour vous? y at-il des auditeurs/intercepteurs et tag-des nettoyants spécifiques?) et la robustesse de la bibliothèque (quelle est la fréquence de mise à jour/maintenance/fixe?). Si vous aimez l'unité de tester le code HTML, puis interface htmlunit est le chemin à parcourir. Si vous souhaitez extraire des données spécifiques dans le code HTML (ce qui est le plus souvent le monde réel), puis Jsoup est le chemin à parcourir.