Analyse HTML Java [fermé]
Je travaille sur une application qui gratte les données d'un site web et je me demandais comment je devrais aller 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 juste
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 bon moyen de donner à une classe une ligne de HTML et d'avoir de bonnes méthodes comme:
boolean usesClass(String CSSClassname);
String getText();
String getLink();
11 réponses
Il y a plusieurs années, j'ai utilisé JTidy dans le même but:
" 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 le HTML malformé et défectueux. En outre, JTidy fournit une interface DOM au document en cours de traitement, ce qui vous permet d'utiliser JTidy comme analyseur DOM pour le HTML réel.
JTidy a été écrit par Andy Quick, qui plus tard a démissionné du poste de mainteneur. Maintenant JTidy est maintenu par un groupe de bénévoles.
Plus d'informations sur JTidy peuvent être trouvées 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 HTML mal formé et permet l'analyse html en Java en utilisant jQuery comme la syntaxe du sélecteur de balises.
Le problème principal comme indiqué par les commentaires précédents est le HTML mal formé, donc un nettoyeur html ou un convertisseur HTML-XML est un must. Une fois que vous obtenez le code XML (XHTML), il y a beaucoup d'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 arborescente (DOM, JDOM, etc.) qui vous permettent même de modifier le code original.
Voici un exemple de code qui utilise HTML cleaner pour obtenir tous les DIVs qui utilisent une certaine classe et imprimer tout le texte contenu à 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 <fernandoDOTmiguelezATgmailDOTcom>
*/
public class TestHtmlParse
{
static final String className = "tags";
static final String url = "http://www.stackoverflow.com";
TagNode rootNode;
public TestHtmlParse(URL htmlPage) throws IOException
{
HtmlCleaner cleaner = new HtmlCleaner();
rootNode = cleaner.clean(htmlPage);
}
List getDivsByClass(String 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();
}
}
}
Le projet HTMLParser ( http://htmlparser.sourceforge.net/) pourrait être une possibilité. Il semble être assez décent pour gérer le HTML mal formé. L'extrait suivant devrait 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 HTML pas bien formé, beaucoup d'exemples.
HTMLUnit pourrait être utile. Il fait beaucoup plus de choses aussi.
N'oublions pas Jerry , son jQuery en java: une bibliothèque Java rapide et concise qui simplifie L'analyse, la traversée et la manipulation des documents HTML; inclut l'utilisation de 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<String, String[]> parameters) {
// process form and parameters
}
});
Bien sûr, ce ne sont que quelques exemples rapides pour avoir le sentiment à quoi tout cela ressemble.
Le nu.validator
project est un excellent analyseur HTML haute performance qui ne coupe pas les coins corrects.
Le Validator.nu HTML Parser est une implémentation de L'algorithme D'analyse HTML5 en Java. L'analyseur est conçu pour fonctionner en remplacement de l'analyseur XML dans les applications qui prennent déjà en charge XHTML 1.X contenu avec un analyseur XML et utiliser SAX, DOM ou XOM pour l'interface avec l'analyseur. Des fonctionnalités de bas niveau sont fournies pour les applications qui le souhaitent pour effectuer leur propre document IO et support.write() à l'aide de scripts. Le noyau de l'analyseur compile sur Google Web Toolkit et peut être traduit automatiquement en C++. (La capacité de traduction c++ est actuellement utilisée pour le portage de l'analyseur pour une utilisation dans Gecko.)
Vous pouvez également utiliser XWiki HTML Cleaner :
Il utilise HTMLCleaner et l'étend pour générer du contenu XHTML 1.1 valide.
Si votre code HTML est bien formé, vous pouvez facilement utiliser un analyseur XML pour faire le travail à votre place... Si vous lisez seulement, SAX {[2] } serait idéal.