Frage

Ich arbeite an einer App, die Daten von einer Website kratzt und ich frage mich, wie ich über das Erhalten der Daten gehen sollte. Insbesondere muß ich in einer Reihe von div-Tags enthaltenen Daten, die eine bestimmte CSS-Klasse verwenden - Zur Zeit (zu Testzwecken) Ich bin nur die Überprüfung für

div class = "classname"

in jeder Zeile von HTML - Dies funktioniert, aber ich kann nicht helfen, aber das Gefühl, es gibt eine bessere Lösung gibt.

Gibt es eine nette Art, wo ich eine Klasse eine Zeile HTML geben könnte und haben einige nette Methoden wie:

boolean usesClass(String CSSClassname);
String getText();
String getLink();
War es hilfreich?

Lösung

Vor einigen Jahren habe ich jtidy für den gleichen Zweck:

http://jtidy.sourceforge.net/

"jtidy ist ein Java-Port von HTML Tidy, ein HTML-Syntax-Checker und ziemlich Drucker. Wie sein Nicht-Java Cousin kann jtidy als Werkzeug zur Reinigung fehlerhafte und fehlerhafte HTML verwendet werden. Darüber hinaus bietet jtidy einen DOM Schnittstelle zu dem Dokument, das verarbeitet wird, die Sie in der Lage zu verwenden jtidy als DOM-Parser für reale HTML effektiv macht.

jtidy wurde von Andy Schnell geschrieben, der von der Maintainer Position später zurücktrat. Jetzt jtidy wird von einer Gruppe von Freiwilligen gepflegt.

Weitere Informationen über jtidy können auf der jtidy Sourceprojektseite gefunden werden. "

Andere Tipps

Eine andere Bibliothek, die für HTML-Verarbeitung nützlich sein könnte, ist jsoup. Jsoup versucht, ungültige HTML zu reinigen und ermöglicht HTML-Analyse in Java jQuery wie Tag-Selektor Syntax.

http://jsoup.org/

Das Hauptproblem, wie angegeben von coments vorhergehenden ist falsch formatiert HTML, so ein HTML-Reiniger oder HTML-XML-Konverter ist ein Muss. Sobald Sie den XML-Code (XHTML) bekommen es gibt viele Werkzeuge, um es zu behandeln. Man könnte es mit einem einfachen SAX-Handler erhalten, die nur die benötigten Daten extrahiert oder einen Baum-basierte Methode (DOM, JDOM, etc.), die Sie auch Original-Code ändern lassen.

Hier ist ein Beispielcode, der HTML cleaner alle DIVs zu erhalten, die eine bestimmte Klasse verwenden und ausdrucken alle Textinhalt in seinem Inneren.

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

Sie könnten interessiert sein von tagsoup , eine Java HTML-Parser können ungültige HTML zu handhaben. XML-Parser würde nur auf gut gebildet XHTML arbeiten.

Das HTMLParser Projekt ( http://htmlparser.sourceforge.net/ ) könnte eine Möglichkeit sein. Es scheint im Umgang mit ungültigen HTML ziemlich anständig zu sein. Der folgende Ausschnitt sollte das tun, was Sie brauchen:

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

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

Einfach zu bedienen, unterstützt nicht gut HTML gebildet, eine Menge von Beispielen.

Htmlunit könnte hilfreich sein. Es tut viel mehr Sachen zu.

http://htmlunit.sourceforge.net/ 1

Lassen Sie uns nicht vergessen Jerry , seine jQuery in Java: eine schnelle und präzise Java-Bibliothek das vereinfacht die HTML-Dokument-Analyse, durchqueren und zu manipulieren; beinhaltet Nutzung von CSS3-Selektoren.

Beispiel:

Jerry doc = jerry(html);
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");

Beispiel:

doc.form("#myform", new JerryFormHandler() {
    public void onForm(Jerry form, Map<String, String[]> parameters) {
        // process form and parameters
    }
});

Natürlich, das sind nur einige kurze Beispiele das Gefühl zu bekommen, wie es aussieht.

Das nu.validator Projekt ist ein ausgezeichneter, leistungsstarke HTML-Parser, der nicht Ecken schneidet correctness- weise.

  

Der Validator.nu HTML-Parser ist eine Implementierung des HTML5-Parsing-Algorithmus in Java. Der Parser ist so konzipiert, als Drop-in-Ersatz für den XML-Parser in Anwendungen arbeiten, die bereits XHTML 1.x Inhalt mit einem XML-Parser verwenden, SAX, DOM oder XOM Schnittstelle mit dem Parser unterstützen. Low-Level-Funktionalität ist für Anwendungen vorgesehen, die ihre eigenen IO und Unterstützung document.write ausführen möchten () mit Scripting. Der Parser Kern kompiliert auf Web Toolkit Google und können automatisch in C ++ übersetzt werden. (Die Übersetzungsfunktion C ++ wird zur Zeit für die Portierung von den Parser für die Verwendung in Gecko verwendet.)

Sie können auch verwenden XWiki HTML-Reiniger :

Es verwendet HTMLCleaner und erweitert sie valides XHTML 1.1 Inhalte zu generieren.

Wenn Sie Ihre HTML wohlgeformt ist, können Sie einfach einen XML-Parser verwenden, um die Arbeit für Sie zu tun ... Wenn Sie nur lesen, SAX wäre ideal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top