2008-10-26 9 views
50

Ich arbeite an einer App, die Daten von einer Website kratzt und ich fragte mich, wie ich die Daten bekommen sollte. Insbesondere muß ich in einer Reihe von div-Tags enthaltenen Daten, die eine bestimmte CSS-Klasse verwenden - Zur Zeit (zu Testzwecken) Ich überprüfe gerade fürJava HTML Parsing

div class = "classname" 

in jeder Zeile von HTML - Dies funktioniert, aber ich kann‘ t helfen, aber fühlen, dass es eine bessere Lösung gibt.

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

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

Related: [Was sind die Vor- und Nachteile der führenden Java-HTML-Parser?] (Http://stackoverflow.com/questions/3152138/what-are-the-pros-and-cons-of-the-leading -java-html-parsers) – BalusC

Antwort

18

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 Druckern Wie sein Nicht-Java Cousine, JTidy kann als Werkzeug zum Aufräumen von fehlerhaftem und fehlerhaftem HTML verwendet werden.Zusätzlich stellt JTidy dem zu verarbeitenden Dokument eine DOM-Schnittstelle zur Verfügung, die es effektiv ermöglicht, JTidy als DOM-Parser für reales HTML zu verwenden

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

Mehr Informationen über jtidy können auf der jtidy Sourceprojektseite gefunden werden“

+2

Traurig jtidy ist langsam wie langsam sein kann. – PlexQ

+0

JTidy scheint ein verlassenes Projekt zu sein, seit ein paar Jahren nicht mehr aktualisiert worden. – rlegendi

0

Wenn Ihr HTML wohlgeformt ist, können Sie einen XML-Parser leicht einsetzen können zu tun der Job für Sie ... Wenn Sie nur lesen, wäre SAX ideal.

+2

Wenn Ihr HTML wohlgeformt ist. Ist es jemals? – PlexQ

+2

Warum sollte es nicht sein? – Yuval

+0

, weil ich mit anderen Leuten an Projekten arbeite, von denen einige Designer sind, die kein perfektes HTML erstellen, und viele andere auch nicht, doppelt so, wenn sie verführerisch sind. – PlexQ

13

Sie könnten interessiert sein, TagSoup, ein Java-HTML-Parser in der Lage, fehlerhafte HTML zu behandeln. XML-Parser würden nur auf gut gebildetem XHTML funktionieren.

5

Das HTMLParser-Projekt (http://htmlparser.sourceforge.net/) könnte eine Möglichkeit sein. Es scheint ziemlich anständig zu sein, wenn es um fehlerhafte HTML geht. 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); 
20

Das Hauptproblem als coments von vorhergehenden angegeben ist falsch formatiert HTML, so ein HTML-Reiniger oder HTML-XML-Konverter ist ein Muss. Sobald Sie den XML-Code (XHTML) erhalten, gibt es viele Tools, um damit umzugehen. Sie können es mit einem einfachen SAX-Handler erhalten, der nur die benötigten Daten extrahiert oder eine baumbasierte Methode (DOM, JDOM usw.), mit der Sie sogar den ursprünglichen Code ändern können.

Hier ist ein Beispielcode, der HTML cleaner verwendet, um alle DIVs zu erhalten, die eine bestimmte Klasse verwenden, und den gesamten Textinhalt darin 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(); 
     } 
    } 
} 
58

Eine weitere Bibliothek, die für die HTML-Verarbeitung nützlich sein könnte, ist jsoup. Jsoup versucht, fehlerhaftes HTML zu bereinigen und ermöglicht das HTML-Parsen in Java mit jQuery wie die Tag-Selektor-Syntax.

http://jsoup.org/

+0

Jsoup ist das beste –

+0

Gibt es eine Methode ohne ein externes Glas zu gehen? – Futuregeek

+1

@Fututegeek Ich habe Regex verwendet, bis ich [diese Antwort] gelesen habe (https://Stackoverflow.com/a/1732454/5484609) –

3

Das nu.validator Projekt ist ein hervorragender, HTML Hochleistungs-Parser, die Ecken nicht Korrektheit weise geschnitten.

Der Validator.nu HTML-Parser ist eine Implementierung des Algorithmus HTML5 Parsing in Java. Der Parser dient als Drop-In-Ersatz für den XML-Parser in Anwendungen, die XHTML 1.x-Inhalte bereits mit einem XML-Parser unterstützen und SAX, DOM oder XOM als Schnittstelle zum Parser verwenden. Low-Level-Funktionalität wird für Anwendungen bereitgestellt, die ihren eigenen IO ausführen und document.write() mit Skripts unterstützen möchten. Der Parser-Kern wird im Google Web Toolkit kompiliert und kann 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.)

4

Vergessen wir nicht, Jerry, seine jQuery in Java: eine schnelle und präzise Java-Bibliothek, die HTML-Dokument Parsing, Traversieren und Manipulieren 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 
    } 
}); 

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

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der antworten Sie hier und geben Sie den Link als Referenz an. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Brian

+1

Danke, Beispiel hinzugefügt. Ich habe bei den meisten anderen Kommentaren keine Beispiele gesehen, daher habe ich das gleiche Muster verfolgt. – igr

+0

Kein Problem. Es zeigte sich in der Warteschlange niedriger Qualität. Mein Kommentar wird von SO automatisiert. – Brian