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.
Jsoup
est bon. J'ai essayé de l'interfacer avec un autre module qui fonctionne avec l'org.w3c.dom.*
API. Trouvé que Jsoup n'obéit pas auorg.w3c.dom.*
contratCet article compare certains aspects des analyseurs suivants:
Ce n'est en aucun cas un résumé complet, et il date de 2008. Mais vous le trouverez peut-être utile.
la source
Ajouter l' analyseur HTML validator.nu , une implémentation de l'algorithme d'analyse HTML5 en Java, à votre liste.
Sur le plan positif, il est spécialement conçu pour correspondre à HTML5 et au cœur du validateur HTML5, il est donc très susceptible de correspondre au comportement d'analyse du futur navigateur avec un très haut degré de précision.
Du côté négatif, l'analyse des anciens navigateurs ne fonctionne pas exactement comme ça, et comme HTML5 est encore à l'état de brouillon, sujet à changement.
En pratique, de tels problèmes n'affectent que des cas d'angle obscurs et constituent à toutes fins pratiques un excellent analyseur.
la source
J'ai trouvé que Jericho HTML Parser était très bien écrit, tenu à jour (ce que la plupart des analyseurs ne sont pas), sans dépendances et facile à utiliser.
la source
J'ajouterai simplement à la réponse @MJB après avoir travaillé avec la plupart des bibliothèques d'analyse HTML en Java, il y a un énorme avantage / inconvénient qui est omis: des analyseurs qui préservent le formatage et l'incorrection du HTML en entrée et en sortie.
C'est la plupart des analyseurs lorsque vous modifiez le document qui fera disparaître les espaces, les commentaires et l'inexactitude du DOM, en particulier s'il s'agit d'une bibliothèque de type XML.
Jericho est le seul analyseur que je connaisse qui vous permette de manipuler du HTML désagréable tout en préservant la mise en forme des espaces et le caractère incorrect du HTML (s'il y en a).
la source
Deux autres options sont HTMLCleaner et HTMLParser .
J'ai essayé la plupart des analyseurs ici pour un framework d'extraction de crawler / données que j'ai développé. J'utilise HTMLCleaner pour la majeure partie du travail d'extraction de données. C'est parce qu'il prend en charge un dialecte raisonnablement moderne de HTML, XHTML, HTML 5, avec des espaces de noms, et il prend en charge DOM, il est donc possible de l' utiliser avec l'implémentation XPath intégrée de Java .
C'est beaucoup plus facile de faire cela avec HTMLCleaner que certains des autres analyseurs: JSoup par exemple prend en charge une interface de type DOM, plutôt que DOM, donc un assemblage est requis . Jericho a une interface SAX-line donc encore une fois cela nécessite un peu de travail bien que Sujit Pal ait une bonne description de la façon de le faire mais à la fin HTMLCleaner fonctionnait mieux.
J'utilise également HTMLParser et Jericho pour une tâche d'extraction de table, qui a remplacé du code écrit à l'aide de libhtml-tableextract-perl de Perl . J'utilise HTMLParser pour filtrer le HTML du tableau, puis j'utilise Jericho pour l'analyser. Je suis d'accord avec les commentaires de MJB et d'Adam selon lesquels Jericho est bon dans certains cas car il préserve le HTML sous-jacent. Il a une sorte d'interface SAX non standard, donc pour le traitement XPath, HTMLCleaner est meilleur.
L'analyse du HTML en Java est un problème étonnamment difficile car tous les analyseurs semblent avoir du mal sur certains types de contenu HTML malformé.
la source