it-swarm.com.de

Java HTML Parsing

Ich arbeite an einer App, die Daten von einer Website kratzt, und ich habe mich gefragt, wie ich vorgehen soll, um die Daten zu erhalten. Insbesondere benötige ich Daten, die in einer Reihe von div-Tags enthalten sind, die eine bestimmte CSS-Klasse verwenden

div class = "classname"

in jeder HTML-Zeile - Das funktioniert, aber ich kann nicht anders, als zu glauben, dass es eine bessere Lösung gibt.

Gibt es eine nette Möglichkeit, einer Klasse eine HTML-Zeile zuzuweisen und einige nette Methoden zu haben, wie:

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

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

http://jtidy.sourceforge.net/

"JTidy ist ein Java Port von HTML Tidy, einem HTML - Syntaxprüfer und hübschen Drucker. Wie sein nicht - Java - Verwandter kann JTidy als Tool zum Aufräumen von fehlerhaftem und fehlerhaftem HTML verwendet werden Darüber hinaus bietet JTidy eine DOM-Schnittstelle für das zu verarbeitende Dokument, sodass Sie JTidy effektiv als DOM-Parser für echtes HTML verwenden können.

JTidy wurde von Andy Quick geschrieben, der später von der Position des Betreuers zurücktrat. Jetzt wird JTidy von einer Gruppe von Freiwilligen betreut.

Weitere Informationen zu JTidy finden Sie auf der JTidy SourceForge-Projektseite. "

18
user31586

Eine andere Bibliothek, die für die HTML-Verarbeitung nützlich sein könnte, ist jsoup. Jsoup versucht, fehlerhaftes HTML zu bereinigen und erlaubt HTML-Analyse in Java mit jQuery-ähnlicher Tag-Selector-Syntax.

http://jsoup.org/

59
rajsite

Das Hauptproblem, das in den vorangegangenen Kommentaren angegeben wurde, ist fehlerhaftes HTML. Daher ist ein HTML-Cleaner oder ein HTML-XML-Konverter ein Muss. Sobald Sie den XML-Code (XHTML) erhalten haben, stehen Ihnen zahlreiche Tools zur Verfügung. Sie können dies mit einem einfachen SAX-Handler erreichen, der nur die von Ihnen benötigten Daten extrahiert, oder mit einer beliebigen baumbasierten Methode (DOM, JDOM usw.), mit der Sie sogar den Originalcode ändern können.

Hier ist ein Beispielcode, der HTML cleaner verwendet, um alle Divs abzurufen, die eine bestimmte Klasse verwenden, und den gesamten darin enthaltenen Textinhalt auszudrucken.

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

Vielleicht interessiert Sie TagSoup , ein Java= HTML-Parser, der mit fehlerhaftem HTML umgehen kann. XML-Parser funktionieren nur mit wohlgeformtem XHTML.

13
PhiLho

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

Einfach zu bedienen, unterstützt nicht gut geformtes HTML, viele Beispiele.

5
FolksLord

Das HTMLParser-Projekt ( http://htmlparser.sourceforge.net/ ) könnte eine Möglichkeit sein. Es scheint ziemlich anständig zu sein, mit fehlerhaftem HTML umzugehen. Das folgende Snippet sollte das tun, was Sie brauchen:

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

HTMLUnit könnte hilfreich sein. Es macht auch viel mehr Zeug.

http://htmlunit.sourceforge.net/1

4
alex

Vergessen wir nicht Jerry , seine jQuery in Java: eine schnelle und übersichtliche Java Bibliothek, die das Parsen, Durchlaufen und Bearbeiten von HTML-Dokumenten vereinfacht; Beinhaltet die Verwendung 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
    }
});

Dies sind natürlich nur einige Beispiele, um ein Gefühl dafür zu bekommen, wie alles aussieht.

4
igr

Das nu.validator project ist ein ausgezeichneter, leistungsstarker HTML-Parser, der die Ecken nicht korrekt abschneidet.

Der Validator.nu HTML-Parser ist eine Implementierung des HTML5-Parsing-Algorithmus in Java. Der Parser soll in Anwendungen, die bereits XHTML 1.x-Inhalt mit einem XML-Parser unterstützen und SAX, DOM oder XOM als Schnittstelle zum Parser verwenden, als Ersatz für den XML-Parser fungieren. Funktionen auf niedriger Ebene werden für Anwendungen bereitgestellt, die ihre eigenen IO und document.write () mit Skripten unterstützen möchten. Der Parser-Kern wird in Google Web Toolkit kompiliert und kann automatisch in C++ übersetzt werden. (Die C++ - Übersetzungsfunktion wird derzeit zum Portieren des Parsers für die Verwendung in Gecko verwendet.)

3
Mike Samuel

Sie können auch XWiki HTML Cleaner verwenden:

Es verwendet HTMLCleaner und erweitert es, um gültigen XHTML 1.1-Inhalt zu generieren.

1
Vincent Massol

Wenn Ihr HTML-Code wohlgeformt ist, können Sie einfach einen XML-Parser einsetzen, um die Aufgabe für Sie zu erledigen ... Wenn Sie nur lesen, würde SAX ideal sein.

0
Yuval