2010-02-18 3 views
5

Ich verwende den HTML-Parser, um eine Anwendung zu entwickeln. Der folgende Code ist nicht in der Lage, den gesamten Satz von Tags auf der Seite zu erhalten. Es gibt einige Tags, die verpasst wurden, und die Attribute und Textkörper von ihnen sind ebenfalls verpasst. Bitte helfen Sie mir zu erklären, warum ist das passiert ..... oder mir andere Art und Weise vorschlagen ....So verwenden Sie den HTML-Parser, um vollständige Informationen zu allen Tags auf der HTML-Seite zu erhalten

URL url = new URL("..."); 
PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt")); 

URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 

HTMLEditorKit htmlKit = new HTMLEditorKit(); 
HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument(); 
HTMLEditorKit.Parser parser = new ParserDelegator(); 
HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0); 
parser.parse(br, callback, true); 

ElementIterator iterator = new ElementIterator(htmlDoc); 
Element element; 
    while ((element = iterator.next()) != null) 
    { 
    AttributeSet attributes = element.getAttributes(); 
    Enumeration e=attributes.getAttributeNames(); 

    pw.println("Element Name :"+element.getName()); 
    while(e.hasMoreElements()) 
    { 
     Object key=e.nextElement(); 
     Object val=attributes.getAttribute(key); 
     int startOffset = element.getStartOffset(); 
    int endOffset = element.getEndOffset(); 
    int length = endOffset - startOffset; 
    String text=htmlDoc.getText(startOffset, length); 

     pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n"); 

    } 
    } 

}

+2

Das Problem ist zu vage. Nehmen Sie eine Beispielwebsite ("http: // google.com" vielleicht?) Und sagen Sie im Detail, was genau fehlt. – BalusC

+0

eigentlich möchte ich Informationen wie Produktname, Preis etc aller Produkte in einer Online-Shopping-Site wie amazon.com extrahiert Wie soll ich darüber gehen ??? –

Antwort

0

Sie schien Swing Htmldocument zu verwenden. Es ist vielleicht nicht die klügste Idee aller Zeiten. Ich glaube, Sie hätten bessere Ergebnisse mit zum Beispiel NekoHtml.

1

ich nach den Kommentaren:

eigentlich mag ich Informationen wie Produktnamen extrahieren, Preis usw. alle in einer Online-Shopping-Site aufgeführten Produkte wie amazon.com Wie soll ich vorgehen? ??

Schritt 1: lesen ihre robots Datei. Es wird normalerweise im Stammverzeichnis der Site gefunden, z. B. http://amazon.com/robots.txt. Wenn die URL, auf die Sie zugreifen möchten, durch eine Disallow auf einer * abgedeckt ist, dann stoppen Sie hier. Kontaktieren Sie sie, erklären Sie ihnen im Detail, was Sie zu tun versuchen, und fragen Sie nach Wegen/Alternativen/Webservices, die Ihnen die benötigten Informationen liefern können. Sonst verletzen Sie die Gesetze und Sie riskieren, von der Seite und/oder von Ihrem Internetdienstanbieter auf die schwarze Liste gesetzt zu werden oder schlimmer. Wenn nicht, dann weiter mit Schritt 2.

Schritt 2: Überprüfen Sie, ob die fragliche Seite nicht bereits einen öffentlichen Webservice zur Verfügung hat, der viel einfacher zu verwenden ist als das Parsen einer ganzen HTML-Seite. Mit einem Webservice erhalten Sie genau die gesuchten Informationen in einem kompakten Format (JSON oder XML) basierend auf einem einfachen Satz von Parametern. Schaue dich um oder kontaktiere sie für Details über Webservices. Wenn es keine Möglichkeit gibt, gehen 3.

Schritt zu Schritt 3: lernen, wie HTML/CSS/JS arbeiten, lernen, wie man mit webdeveloper Tools wie Firebug arbeiten, lernen, wie Sie die HTML/CSS/JS Quelle interpretieren Sie see by rightclick>Seite anzeigen Quelle. Ich wette, dass die fragliche Seite JS/Ajax zum Laden/Füllen der Informationen verwendet, die Sie sammeln möchten. In diesem Fall müssen Sie einen HTML-Parser verwenden, der auch JS parsen und ausführen kann (der, den Sie verwenden, macht das nicht). Das wird kein einfacher Job, deshalb werde ich es nicht im Detail erklären, bis es ganz klar ist, was Sie erreichen wollen und ob das erlaubt ist und ob es nicht einfachere Webservices gibt verfügbar.

+0

Schritt 1: Robots.txt erlaubt. Es ist kein Prob. Schritt 2: Ich habe versucht, AWS für diese Angelegenheit, aber es gibt keine umfassende Liste aller Informationen, die ich brauche. Aber die Informationen können auf der Webseite gesehen werden.So muss ich eigentlich zu Schritt 3 gehen Schritt 3: Jetzt ist das Problem, dass ich Produktnamen, Preis, Funktionen extrahieren muss. Dies kann geschehen, wenn ich das Muster, wie diese Informationen auf der Webseite gespeichert sind, manuell identifiziere. Aber jetzt möchte ich einen Weg, der diese Mustererkennung automatisieren sollte oder in der Lage sein sollte, sie zu extrahieren, ohne dass irgendein Muster dem Programm zur Verfügung gestellt wurde. Wie soll ich vorgehen? Danke –

9

Ich mache das ziemlich zuverlässig mit HTML Parser, (vorausgesetzt, dass das HTML-Dokument seine Struktur nicht ändert). Ein Web-Service mit einer stabilen API ist viel besser, aber manchmal haben wir einfach keinen.

Allgemeine Idee:

Sie müssen zuerst in welchem ​​Tags wissen (div, meta, span, usw.) die gewünschten Informationen sind in, und kennen die Eigenschaften diese Tags zu identifizieren. Beispiel:

<span class="price"> $7.95</span> 

, wenn Sie sich für diesen „Preis“ suchen, dann sind Sie interessiert span Tags mit class „Preis“.

HTML-Parser verfügt über eine Filter-nach-Attribut-Funktionalität.

filter = new HasAttributeFilter("class", "price"); 

Wenn Sie einen Filter analysieren, werden Sie eine Liste von Nodes erhalten, die Sie auf ihnen eine instanceof Betrieb tun können, um festzustellen, ob sie von dem Typ sind Sie interessiert sind, für span würden Sie etwas tun wie

if (node instanceof Span) // or any other supported element. 

Siehe Liste der unterstützten Tags here.

Ein Beispiel mit HTML-Parser den Meta-Tag zu ergreifen, die Beschreibung über eine Website hat:

Tag Probe:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

Code:

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.tags.MetaTag; 

public class HTMLParserTest { 
    public static void main(String... args) { 
     Parser parser = new Parser(); 
     //<meta name="description" content="Some texte about the site." /> 
     HasAttributeFilter filter = new HasAttributeFilter("name", "description"); 
     try { 
      parser.setResource("http://www.youtube.com"); 
      NodeList list = parser.parse(filter); 
      Node node = list.elementAt(0); 

      if (node instanceof MetaTag) { 
       MetaTag meta = (MetaTag) node; 
       String description = meta.getAttribute("content"); 

       System.out.println(description); 
       // Prints: "YouTube is a place to discover, watch, upload and share videos." 
      } 

     } catch (ParserException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
0

Tag auf Google-Seite- <title>Google</title> Ich versuche, Textinhalt abrufen In title tag. Aber ich bekomme keine Ausgabe. Es zeigt Build Successfull und löst Ausgabe als "TITLE". Ich brauche eine Ausgabe als "GOOGLE".

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.filters.IsEqualFilter; 
import org.htmlparser.tags.MetaTag; 
import org.htmlparser.tags.TitleTag; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
public class MM { 
public static void main(String[] args) { 
     Parser parser=new Parser(); 


     try 
     { 
      parser.setResource("http://www.google.com"); 
      TitleTag title=new TitleTag(); 
      String tagtext=title.getTitle(); 
      System.out.println(tagtext); 


     } 

     }catch (ParserException e) { 

     } 

    } 
} 
Verwandte Themen