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();
51
demandé sur Eric Leschinski 2008-10-26 16:57:00

11 réponses

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 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 ."

18
répondu user31586 2008-10-26 16:06:03

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.

Http://jsoup.org/

58
répondu rajsite 2013-12-24 09:40:00

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();
        }
    }
}
20
répondu Fernando Miguélez 2008-10-26 14:55:57

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

13
répondu PhiLho 2008-10-26 14:16:42

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
répondu dave 2008-10-26 14:23:12

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

Facile à utiliser, Prend en charge HTML pas bien formé, beaucoup d'exemples.

5
répondu FolksLord 2011-01-21 18:36:15

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

Http://htmlunit.sourceforge.net/1

4
répondu alex 2008-10-26 19:16:21

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.

4
répondu igr 2014-10-03 15:20:20

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.)

3
répondu Mike Samuel 2011-08-19 00:13:16

Vous pouvez également utiliser XWiki HTML Cleaner :

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

1
répondu Vincent Massol 2012-11-10 08:45:56

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.

0
répondu Yuval 2013-01-10 09:27:46