web-dev-qa-db-fra.com

Java Analyse HTML

Je travaille sur une application qui récupère les données d'un site Web et je me demandais comment faire 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 m'empêcher de penser qu'il existe une meilleure solution.

Existe-t-il un moyen agréable de donner à une classe une ligne de HTML et d'avoir des méthodes Nice comme:

boolean usesClass(String CSSClassname);
String getText();
String getLink();
52
Richard Walton

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

http://jtidy.sourceforge.net/

"JTidy est un port Java 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 mal formé et défectueux. De plus, JTidy fournit une interface DOM au document en cours de traitement, ce qui vous permet d'utiliser JTidy comme analyseur DOM pour du HTML réel.

JTidy a été écrit par Andy Quick, qui a ensuite démissionné de la position de responsable. Maintenant, JTidy est entretenu par un groupe de bénévoles.

Plus d'informations sur JTidy peuvent être trouvées sur la page du projet JTidy SourceForge. "

18
user31586

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

http://jsoup.org/

59
rajsite

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 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 un arbre (DOM, JDOM, etc.) qui vous permet même de modifier le code d'origine.

Voici un exemple de code qui utilise HTML cleaner pour obtenir tous les DIVs qui utilisent une certaine classe et imprimer tout le contenu 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 <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();
        }
    }
}
20
Fernando Miguélez

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

13
PhiLho

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

Facile à utiliser, supporte un HTML mal formé, beaucoup d'exemples.

5
FolksLord

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);
5
dave

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

http://htmlunit.sourceforge.net/1

4
alex

N'oublions pas Jerry , sa jQuery en Java: une bibliothèque rapide et concise Java Bibliothèque qui simplifie l'analyse, la traversée et la manipulation des 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<String, String[]> parameters) {
        // process form and parameters
    }
});

Bien sûr, ce ne sont que quelques exemples rapides pour avoir l'impression à quoi tout cela ressemble.

4
igr

Le nu.validator project est un excellent analyseur HTML haute performance qui ne coupe pas les coins correctement.

L'analyseur HTML Validator.nu 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 le contenu XHTML 1.x avec un analyseur XML et utilisent SAX, DOM ou XOM pour interfacer avec l'analyseur. Des fonctionnalités de bas niveau sont fournies pour les applications qui souhaitent effectuer leur propre IO et prennent en charge document.write () avec des scripts. Le noyau de l'analyseur se compile sur Google Web Toolkit et peut être automatiquement traduit en C++. (La capacité de traduction C++ est actuellement utilisée pour le portage de l'analyseur pour une utilisation dans Gecko.)

3
Mike Samuel

Vous pouvez également utiliser XWiki HTML Cleaner :

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

1
Vincent Massol

Si votre code HTML est bien formé, vous pouvez facilement utiliser un analyseur XML pour faire le travail pour vous ... Si vous ne faites que lire, SAX serait être idéal.

0
Yuval