174 votes

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

Cherche et Google, j'ai trouvé qu'il y a un peu de Java HTML parseurs qui sont constamment recommandés par les diverses parties. Malheureusement, il est difficile de trouver des informations sur les points forts et les faiblesses des différentes bibliothèques. J'espère que certaines personnes ont passé la comparaison de ces bibliothèques, et peuvent partager ce qu'ils ont appris.

Voici ce que j'ai vu:

Et si il y a un grand analyseur que j'ai raté, j'aimerais l'entendre sur ses avantages et inconvénients.

Merci!

222voto

BalusC Points 498232

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.

13voto

Matt Solnit Points 13528

Cet article compare certains aspects des analyseurs suivants :

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

Il n’est nullement un résumé complet, et c’est à partir de 2008. Mais il peut s’avérer utile.

7voto

Alohci Points 30645

Ajouter Le validateur.nu Analyseur HTML, la mise en œuvre du HTML5 algorithme d'analyse en Java, à votre liste.

Sur le côté positif, il est spécifiquement conçu pour correspondre à HTML5, et au cœur du validateur HTML5, donc très susceptible de correspondre à l'avenir navigateur d'analyse du comportement à un très haut degré de précision.

Sur le côté négatif, aucun des navigateurs de l'héritage de l'analyse fonctionne exactement comme cela, et comme HTML5 est encore en projet, sous réserve de changement.

Dans la pratique, ces problèmes n'affectent coin obscur des cas, et est à toutes fins pratiques, un excellent analyseur.

7voto

MJB Points 5096

J’ai trouvé Jericho HTML Parser pour être très bien écrit, mises à jour (qui ne sont pas beaucoup des analyseurs), aucune dépendance et facile à utiliser

6voto

Adam Gent Points 15055

Je vais juste ajouter à @MJB réponse après avoir travaillé avec la plupart de l'analyse HTML de bibliothèques en Java, il y a une énorme pro/con qui est omis: les analyseurs syntaxiques qui permettent de préserver la mise en forme et l'inexactitude de l'HTML sur entrée et de sortie.

C'est la plupart des analyseurs lorsque vous modifiez le document de souffler les espaces, les commentaires, et l'inexactitude des DOM en particulier si elles sont un XML comme la bibliothèque.

Jericho est le seul analyseur je sais qui vous permet de manipuler méchant HTML tout en préservant les espaces de formatage et de l'inexactitude de l'HTML (si il y en a un).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X