Général
Presque tous les analyseurs HTML connus implémentent l' API DOM W3C (qui fait partie de l'API JAXP, API Java pour le traitement XML) et vous donne un org.w3c.dom.Document
retour qui est prêt pour une utilisation directe par l'API JAXP. Les différences majeures se trouvent généralement dans les fonctionnalités de l'analyseur en question. La plupart des analyseurs sont dans une certaine mesure indulgents et indulgents avec du HTML non bien formé («tagsoup»), comme JTidy , NekoHTML , TagSoup et HtmlCleaner . Vous utilisez généralement ce type d'analyseurs HTML pour "ranger" la source HTML (par exemple en remplaçant le HTML-valide <br>
par un XML-valide<br />
), afin de pouvoir le parcourir "de la manière habituelle" en utilisant le DOM W3C et l'API JAXP.
Les seuls qui sautent sont HtmlUnit et Jsoup .
HtmlUnit
HtmlUnit fournit une API entièrement propre qui vous donne la possibilité d'agir comme un navigateur Web par programmation. Ie entrer des valeurs de formulaire, cliquer sur des éléments, appeler JavaScript, etc. C'est bien plus qu'un simple analyseur HTML. C'est un véritable "navigateur Web sans interface graphique" et un outil de test unitaire HTML.
Jsoup
Jsoup fournit également une API entièrement propre. Il vous donne la possibilité de sélectionner des éléments à l'aide de sélecteurs CSS de type jQuery et fournit une API astucieuse pour parcourir l'arborescence DOM HTML pour obtenir les éléments d'intérêt.
En particulier, la traversée de l'arborescence HTML DOM est la force majeure de Jsoup. Ceux qui ont travaillé avec org.w3c.dom.Document
savent à quel point il est difficile de traverser le DOM en utilisant le verbeux NodeList
et les Node
API. Vrai,XPath
facilite la vie, mais c'est quand même une autre courbe d'apprentissage et cela peut finir par être encore verbeux.
Voici un exemple qui utilise un analyseur DOM W3C "simple" comme JTidy en combinaison avec XPath pour extraire le premier paragraphe de votre question et les noms de tous les répondants (j'utilise XPath car sans lui, le code nécessaire pour rassembler les informations d'intérêt serait autrement 10 fois plus grand, sans écrire de méthodes utilitaires / d'assistance).
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 comment 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? Ce n'est pas seulement moins de code, mais Jsoup est également relativement facile à comprendre si vous avez déjà une expérience modérée avec les sélecteurs CSS (par exemple en développant des sites Web et / ou en utilisant jQuery).
Résumé
Les avantages et les inconvénients de chacun devraient être suffisamment clairs maintenant. Si vous souhaitez simplement utiliser l'API JAXP standard pour la parcourir, optez pour le premier groupe d'analyseurs mentionné. Il y en a beaucoup . Lequel choisir dépend des fonctionnalités qu'il fournit (comment le nettoyage HTML est-il facilité pour vous? Y a-t-il des écouteurs / intercepteurs et des nettoyeurs spécifiques aux balises?) Et de la robustesse de la bibliothèque (à quelle fréquence est-elle mise à jour / maintenue / corrigée? ). Si vous aimez tester le code HTML, HtmlUnit est la solution. Si vous aimez extraire des données spécifiques du HTML (ce qui est plus que souvent l'exigence du monde réel), alors Jsoup est la voie à suivre.