Analyse HTML Java

Je travaille sur une application qui récupère les données d’un site Web et je me demandais comment je devrais procéder pour obtenir les données. Plus précisément, j’ai besoin de données contenues dans un certain nombre de balises div qui utilisent une classe CSS spécifique – Actuellement (à des fins de test), je vérifie simplement

div class = "classname" 

dans chaque ligne de HTML – Cela fonctionne, mais je ne peux pas m’empêcher de penser qu’il existe une meilleure solution.

Y a-t-il un moyen agréable de donner à une classe une ligne de code HTML et de disposer de méthodes intéressantes telles que:

 boolean usesClass(Ssortingng CSSClassname); Ssortingng getText(); Ssortingng getLink(); 

Il y a plusieurs années, j’ai utilisé JTidy dans le même but:

http://jtidy.sourceforge.net/

“JTidy est un port Java de HTML Tidy, un vérificateur de syntaxe HTML et une jolie imprimante. Comme son cousin non-Java, JTidy peut être utilisé comme un outil pour nettoyer les codes HTML mal formés. En outre, JTidy fournit une interface DOM document en cours de traitement, ce qui vous permet d’utiliser JTidy comme parsingur DOM pour le HTML réel.

JTidy a été écrit par Andy Quick, qui a ensuite quitté son poste de responsable. Maintenant, JTidy est entretenu par un groupe de volontaires.

Vous trouverez plus d’informations sur JTidy sur la page du projet JTidy SourceForge. ”

Une autre bibliothèque qui pourrait être utile pour le traitement HTML est jsoup. Jsoup essaie de nettoyer le code HTML mal formé et autorise l’parsing HTML en Java en utilisant la syntaxe de sélecteur de balises jQuery.

http://jsoup.org/

Le principal problème, comme indiqué dans les commentaires précédents, est un code HTML mal formé, donc un nettoyeur HTML ou HTML-XML est indispensable. Une fois que vous obtenez le code XML (XHTML), il existe de nombreux outils pour le gérer. Vous pouvez l’obtenir avec un simple gestionnaire SAX qui extrait uniquement les données dont vous avez besoin ou toute méthode basée sur une arborescence (DOM, JDOM, etc.) qui vous permet même de modifier le code d’origine.

Voici un exemple de code qui utilise le nettoyeur HTML pour obtenir toutes les DIV qui utilisent une certaine classe et imprimer tout le contenu du texte à l’intérieur.

 import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; /** * @author Fernando Miguélez Palomo  */ public class TestHtmlParse { static final Ssortingng className = "tags"; static final Ssortingng url = "http://www.stackoverflow.com"; TagNode rootNode; public TestHtmlParse(URL htmlPage) throws IOException { HtmlCleaner cleaner = new HtmlCleaner(); rootNode = cleaner.clean(htmlPage); } List getDivsByClass(Ssortingng CSSClassname) { List divList = new ArrayList(); TagNode divElements[] = rootNode.getElementsByName("div", true); for (int i = 0; divElements != null && i < divElements.length; i++) { String classType = divElements[i].getAttributeByName("class"); if (classType != null && classType.equals(CSSClassname)) { divList.add(divElements[i]); } } return divList; } public static void main(String[] args) { try { TestHtmlParse thp = new TestHtmlParse(new URL(url)); List divs = thp.getDivsByClass(className); System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***"); for (Iterator iterator = divs.iterator(); iterator.hasNext();) { TagNode divElement = (TagNode) iterator.next(); System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); } } catch(Exception e) { e.printStackTrace(); } } } 

Vous pourriez être intéressé par TagSoup , un parsingur HTML Java capable de gérer un code HTML mal formé. Les parsingurs XML ne fonctionneraient que sur du XHTML bien formé.

Le projet HTMLParser ( http://htmlparser.sourceforge.net/ ) pourrait être une possibilité. Il semble être assez décent de gérer le HTML mal formé. L’extrait suivant doit faire ce dont vous avez besoin:

 Parser parser = new Parser(htmlInput); CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("DIV.targetClassName"); NodeList nodes = parser.parse(cssFilter); 

Jéricho: http://jericho.htmlparser.net/docs/index.html

Facile à utiliser, prend en charge pas bien formé HTML, beaucoup d’exemples.

HTMLUnit peut être utile. Il fait beaucoup plus de choses aussi.

http://htmlunit.sourceforge.net/ 1

N’oublions pas Jerry , son jQuery dans Java: une bibliothèque Java rapide et concise qui simplifie l’parsing, la traversée et la manipulation de documents HTML; inclut l’utilisation des sélecteurs css3.

Exemple:

 Jerry doc = jerry(html); doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy"); 

Exemple:

 doc.form("#myform", new JerryFormHandler() { public void onForm(Jerry form, Map parameters) { // process form and parameters } }); 

Bien sûr, ce ne sont que quelques exemples rapides pour comprendre à quoi cela ressemble.

Le projet nu.validator est un excellent parsingur HTML hautes performances qui ne nu.validator les nu.validator en matière de correction.

L’parsingur HTML Validator.nu est une implémentation de l’algorithme d’parsing HTML5 en Java. L’parsingur est conçu pour remplacer l’parsingur XML dans les applications qui prennent déjà en charge le contenu XHTML 1.x avec un parsingur XML et utilisent SAX, DOM ou XOM pour s’interfacer avec l’parsingur. Une fonctionnalité de bas niveau est fournie aux applications qui souhaitent effectuer leur propre E / S et prendre en charge document.write () avec les scripts. Le kernel de l’parsingur est compilé sur Google Web Toolkit et peut être automatiquement traduit en C ++. (La fonctionnalité de traduction C ++ est actuellement utilisée pour le portage de l’parsingur dans Gecko.)

Vous pouvez également utiliser XWiki HTML Cleaner :

Il utilise HTMLCleaner et l’étend pour générer un contenu XHTML 1.1 valide.

Si votre HTML est bien formé, vous pouvez facilement utiliser un parsingur XML pour faire le travail à votre place … Si vous ne lisez que, SAX serait idéal.