Quels sont les avantages et les inconvénients des principaux analyseurs Java HTML? [fermé]
en cherchant SO et Google, j'ai trouvé qu'il y a quelques analyseurs Java HTML qui sont systématiquement recommandés par 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:
- JTidy
- NekoHTML
- jsoup
- TagSoup
et s'il y a un analyseur majeur que j'ai manqué, j'aimerais entendre parler de ses avantages et inconvénients ainsi.
Merci!
6 réponses
général
presque tous les analyseurs HTML connus implémentent le W3C DOM API (partie de L'API JAXP, API Java pour le traitement XML) et vous donne un org.w3c.dom.Document
back qui est prêt pour une utilisation directe par L'API JAXP. Les principales différences se trouvent généralement dans les caractéristiques de l'analyseur en question. La plupart des parseurs sont, dans une certaine mesure, indulgents et indulgents avec le HTML non bien formé ("tagsoup"), comme JTidy , NekoHTML , TagSoup et HtmlCleaner . Vous utilisez habituellement ce genre de parsers HTML pour "ranger" la source HTML (par exemple remplacer le code HTML valide <br>
par un code XML valide <br />
), de sorte que vous pouvez la 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 complètement propre qui vous donne la possibilité d'agir comme un webbrowser programmatique. C'est-à-dire: entrez les valeurs du formulaire, cliquez sur les éléments, invoquez JavaScript,etc. C'est bien plus qu'un simple analyseur HTML. Il s'agit d'un véritable outil de test de l'unité "GUI-less webbrowser" et de L'unité HTML.
Jsoup
Jsoup fournit également un complètement propre API. Il vous donne la possibilité de sélectionner des éléments en utilisant jQuery -comme CSS selectors et fournit une API slick pour traverser L'arbre de DOM HTML pour obtenir les éléments d'intérêt.
en particulier la traversée de L'arbre des DOM HTML est la force majeure de Jsoup. Ceux qui ont travaillé avec org.w3c.dom.Document
savent à quel point c'est douloureux de traverser le DOM en utilisant le verbose NodeList
et Node
Api. Vrai, XPath
ça rend la vie plus facile, mais c'est quand même une autre courbe d'apprentissage et ça peut finir par être encore verbeux.
voici un exemple qui utilise un DOM parser W3C simple comme JTidy en combinaison avec XPath pour extraire le premier paragraphe de votre question et les noms de tous les answerers (j'utilise XPath car sans lui, le code nécessaire pour recueillir les informations de autrement l'intérêt grandirait 10 fois plus grand, sans écrire utilitaire / méthodes d'aide).
String url = "/q/what-are-the-pros-and-cons-of-the-leading-java-html-parsers-closed-9784/";
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 = "/q/what-are-the-pros-and-cons-of-the-leading-java-html-parsers-closed-9784/";
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 aussi relativement facile à saisir 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 voulez simplement utiliser L'API JAXP standard pour la parcourir, optez pour le premier groupe de parsers mentionné. Il ya assez beaucoup d'entre eux. Lequel choisir dépend des fonctionnalités qu'il offre (comment est HTML nettoyage facile pour vous? y a-t-il des écouteurs/intercepteurs et des nettoyeurs spécifiques aux étiquettes?) et la robustesse de la bibliothèque (quelle est la fréquence de mise à jour/maintenance/fixe?). Si vous aimez unité tester le HTML, puis HtmlUnit est la voie à suivre. Si vous aimez extraire des données spécifiques du HTML (qui est plus que souvent l'exigence du monde réel), alors Jsoup est la voie à suivre.
cet article compare certains aspects des parsers suivants:
- NekoHTML
- JTidy
- TagSoup
- HtmlCleaner
il ne s'agit nullement d'un résumé complet, et il Date de 2008. Mais vous trouverez peut-être utile.
ajouter le validateur.nu HTML Parser , une implémentation de L'algorithme d'analyse HTML5 en Java, à votre liste.
du 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 au comportement d'analyse du futur navigateur à un très haut degré de précision.
du côté négatif, aucun navigateur parsing de l'héritage fonctionne exactement comme ceci, et comme HTML5 est toujours dans le projet, sous réserve de modifications.
dans la pratique, de tels problèmes ne touchent que les cas de coin obscurs, et est à toutes fins pratiques, un excellent analyseur.
je vais juste ajouter à la réponse @MJB après avoir travaillé avec la plupart des bibliothèques HTML parsing en Java, il y a un énorme pro/con qui est omis: les parsers qui préservent le formatage et l'inexactitude du HTML sur l'entrée et la sortie.
qui est la plupart des analyseurs lorsque vous changez le document va souffler l'espace blanc, les commentaires, et l'inexactitude du DOM en particulier si elles sont une bibliothèque XML comme.
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).
deux autres options sont HTMLCleaner et HTMLParser .
j'ai essayé la plupart des analyseurs ici pour un cadre de crawler / extraction de données que j'ai développé. J'utilise HTMLCleaner pour l'essentiel du travail d'extraction de données. C'est parce qu'il soutient un dialecte raisonnablement moderne de HTML, XHTML, HTML 5, avec des espaces de noms, et il soutient DOM, donc il est possible de l'utiliser avec Java construit dans XPath la mise en œuvre .
il est beaucoup plus facile de faire cela avec HTMLCleaner que certains des autres parsers: JSoup par exemple supporte une interface DOM comme, plutôt que DOM, donc quelque montage nécessaire . Jericho a une interface SAX-line donc encore une fois il est nécessite du travail bien que Sujit Pal a une bonne description de la façon de faire ce mais à la fin HTMLCleaner juste mieux travaillé.
j'utilise aussi HTMLParser et Jericho pour une tâche d'extraction de table, qui a remplacé une partie du code écrit en utilisant Perl libhtml-tableextract-perl . J'utilise HTMLParser pour filtrer le HTML pour la table, puis J'utilise Jericho pour la Parser. Je suis d'accord avec les commentaires de MJB et Adam que Jéricho est bon dans certains cas parce qu'il préserve le HTML sous-jacent. Il a une sorte d'interface SAX non standard, donc pour le traitement XPath HTMLCleaner est mieux.
Parsing HTML en Java est un problème étonnamment difficile que tous les parsers semblent lutter sur certains types de contenu HTML malformé.