Question

Je travaille sur une application qui récupère les données d'un site Web et je me demandais comment je devrais obtenir ces données. Plus précisément, j'ai besoin des 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.

Existe-t-il un moyen intéressant de donner à une classe une ligne HTML et d’avoir des méthodes agréables telles que:

boolean usesClass(String CSSClassname);
String getText();
String getLink();
Était-ce utile?

La solution

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

http://jtidy.sourceforge.net/

"JTidy est un portage en 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 de nettoyage de HTML mal formé ou défectueux. En outre, JTidy fournit une interface DOM au document en cours de traitement, ce qui vous permet effectivement d’utiliser JTidy en tant qu’analyseur DOM pour du code HTML réel.

JTidy a été écrit par Andy Quick, qui a ensuite quitté le 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. "

Autres conseils

Une autre bibliothèque qui pourrait être utile pour le traitement HTML est jsoup. Jsoup essaie de nettoyer le code HTML mal formé et permet l'analyse syntaxique HTML en Java à l'aide de la syntaxe jQuery, semblable à celle du sélecteur de balises.

http://jsoup.org/

Le problème principal, comme indiqué dans les commentaires précédents, est le code HTML mal formé. Un nettoyeur HTML ou un convertisseur HTML-XML est donc indispensable. Une fois que vous avez obtenu le code XML (XHTML), vous disposez 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 n'importe quelle méthode arborescente (DOM, JDOM, etc.) qui vous permet même de modifier le code d'origine.

Voici un exemple de code qui utilise nettoyeur HTML pour obtenir tous les DIV utilisant une classe donnée et les imprimer. tout le contenu textuel qu'il contient.

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();
        }
    }
}

Vous pourriez être intéressé par TagSoup , un fichier Java Analyseur HTML capable de gérer du HTML mal formé. Les analyseurs 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 à manipuler du HTML malformé. 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);

Jericho: http://jericho.htmlparser.net/docs/index.html

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

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

http://htmlunit.sourceforge.net/ 1

N'oublions pas Jerry , son jQuery en java: une bibliothèque Java rapide et concise cela simplifie l'analyse, 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<String, String[]> parameters) {
        // process form and parameters
    }
});

Bien sûr, ce ne sont là que quelques exemples rapides pour vous donner une idée de la situation.

Le projet nu.validator est un excellent code HTML hautes performances. Un analyseur qui ne coupe pas les coins avec la correction.

  

L’analyseur HTML Validator.nu est une implémentation de l’algorithme d’analyse HTML5 en Java. L'analyseur est conçu pour fonctionner comme un remplacement instantané 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 l'interface avec l'analyseur. Des fonctionnalités de bas niveau sont fournies pour les applications qui souhaitent exécuter leurs propres E / S et prendre en charge document.write () avec des scripts. Le noyau de l’analyseur est compilé dans Google Web Toolkit et peut être traduit automatiquement en C ++. (La fonctionnalité de traduction C ++ est actuellement utilisée pour le portage de l'analyseur pour une utilisation dans Gecko.)

Vous pouvez également utiliser le Nettoyeur HTML XWiki :

Il utilise HTMLCleaner et l'étend de manière à générer un contenu XHTML 1.1 valide.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top