Quels sont les avantages et les inconvénients des principaux analyseurs HTML Java? [fermé]

175

En recherchant SO et Google, j'ai trouvé qu'il existe quelques analyseurs HTML Java qui sont systématiquement recommandés par diverses parties. Malheureusement, il est difficile de trouver des informations sur les forces et les faiblesses des différentes bibliothèques. J'espère que certaines personnes auront passé un peu à comparer ces bibliothèques et pourront partager ce qu'elles ont appris.

Voici ce que j'ai vu:

Et s'il y a un analyseur majeur que j'ai manqué, j'aimerais également connaître ses avantages et ses inconvénients.

Merci!

Lin Avi
la source

Réponses:

223

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.Documentretour 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.Documentsavent à quel point il est difficile de traverser le DOM en utilisant le verbeux NodeListet les NodeAPI. 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.

BalusC
la source
Il y a un énorme pour / contre qui est omis ici: Jericho est le seul analyseur que je connaisse qui vous permet de manipuler du HTML désagréable tout en préservant la mise en forme des espaces et l'inexactitude du HTML (s'il y en a).
Adam Gent
3
Jsoupest 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 au org.w3c.dom.*contrat
Thamme Gowda
13

Cet article compare certains aspects des analyseurs suivants:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

Ce n'est en aucun cas un résumé complet, et il date de 2008. Mais vous le trouverez peut-être utile.

Matt Solnit
la source
Ceci est une réponse par lien uniquement. Pouvez-vous ajouter les détails pertinents ici?
Réintégrer Monica - notmaynard
7

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.

Alohci
la source
7

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.

MJB
la source
6

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).

Adam Gent
la source
3

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é.

Mark Butler
la source