52 votes

Analyse HTML de Java

Je travaille sur une application qui gratte les données à partir d'un site web et je me demandais comment je dois 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 - à l'heure actuelle (à des fins de test) je suis juste vérifier

div class = "classname"

dans chaque ligne de HTML, Cela fonctionne, mais je ne peux pas aider mais se sentir il ya une meilleure solution.

Est-il un moyen agréable où j'ai pu donner une classe à une ligne de code HTML et avoir du bon, les méthodes comme:

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

59voto

Milan Points 601

Une autre bibliothèque qui pourraient être utiles pour le traitement HTML est jsoup. Jsoup essaie de nettoyer le code HTML mal formé et permet l'analyse html en Java à l'aide de jQuery comme sélecteur de balises la syntaxe.

http://jsoup.org/

20voto

Fernando Miguélez Points 7532

Le principal problème, comme indiqué par les précédents commentaires est incorrect en HTML, html cleaner ou HTML-XML converter est un must. Une fois que vous obtenez le code XML (XHTML) il existe de nombreux outils pour la gérer. Vous pouvez l'obtenir avec un simple SAX gestionnaire des extraits uniquement les données dont vous avez besoin ou tout basées sur les arbres de la méthode (DOM, JDOM, etc.) qui vous permettent de modifier le code d'origine.

Voici un exemple de code qui utilise HTML nettoyant pour obtenir tous les DIVs qui utilisent une certaine classe et d'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();
        }
    }
}

18voto

user31586 Points 209

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

http://jtidy.sourceforge.net/

"JTidy est un Java port de HTML Tidy, un vérificateur de syntaxe HTML et assez imprimante. Comme son non-Java cousin, JTidy peut être utilisé comme un outil de nettoyage mal fait et défectueux HTML. En outre, JTidy fournit une interface DOM du document qui est en cours de traitement, ce qui vous rend capable de les utiliser JTidy comme un DOM parser le monde réel HTML.

JTidy a été écrit par Andy Rapide, qui plus tard a quitté le responsable de position. Maintenant JTidy est maintenu par un groupe de bénévoles.

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

13voto

PhiLho Points 23458

Vous pourriez être intéressé par TagSoup, Java, HTML analyseur capable de gérer du code HTML mal formé. Parseurs XML ne fonctionne que sur bien formé XHTML.

5voto

dave Points 919

Le HTMLParser projet (http://htmlparser.sourceforge.net/) pourrait être une possibilité. Il semble être assez décent à la manipulation du code HTML mal formé. L'extrait de code suivant devrait faire ce que vous avez besoin de:

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

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