2012-07-14 3 views
1

suite à ma précédente question ici: Extending a basic web crawler to filter status codes and HTML, je suis en train d'extraire des informations à partir des balises HTML, dans ce cas, « title », avec la méthode suivante:Parsing HTML dans web crawler

public static void parsePage() throws IOException, BadLocationException 
{ 
    HTMLEditorKit kit = new HTMLEditorKit(); 
    HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument(); 
    doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE); 
    Reader HTMLReader = new InputStreamReader(testURL.openConnection() 
      .getInputStream()); 
    kit.read(HTMLReader, doc, 0); 

    // Create an iterator for all HTML tags. 
    ElementIterator it = new ElementIterator(doc); 
    Element elem; 

    while ((elem = it.next()) != null) 
    { 
     if (elem.getName().equals("title")) 
     { 
      System.out.println("found title tag"); 
     } 
    } 
} 

Cela fonctionne en ce qui me dit qu'il a trouvé les étiquettes. Ce que je suis aux prises avec est de savoir comment extraire les informations contenues après/en leur sein.

J'ai trouvé cette question sur le site: Help with Java Swing HTML parsing, mais elle indique qu'elle ne fonctionnera qu'avec du HTML bien formé. J'espérais qu'il y a un autre moyen.

N'importe quel pointeur apprécié.

Répondre

1

Transforme en changeant la méthode de ce produit le résultat souhaité:

{ 
      HTMLEditorKit kit = new HTMLEditorKit(); 
      HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument(); 
      doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE); 
      Reader HTMLReader = new InputStreamReader(testURL.openConnection().getInputStream()); 
      kit.read(HTMLReader, doc, 0); 
      String title = (String) doc.getProperty(Document.TitleProperty); 
      System.out.println(title); 
    } 

Je pense que je partais sur un sauvage chasse à l'oie avec des trucs d'itérateur/élément.

3

Essayez d'utiliser Jodd

Jerry jerry = jerry().enableHtmlMode().parse(html); 
... 

Ou HtmlParser

Parser parser = new Parser(htmlInput); 
CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("title"); 
NodeList nodes = parser.parse(cssFilter); 
+0

Merci Alexey. Y at-il un moyen de le faire sans utiliser une bibliothèque externe? – Robert

+1

Si vous avez besoin d'une solution jetable rapide, vous pouvez extraire le titre en utilisant des expressions régulières, mais en général, évitez d'utiliser des expressions rationnelles pour le HTML –

+0

Oui, je suppose que l'utilisation d'expressions rationnelles pour analyser le HTML est mal vue. Dans ce cas, j'ai seulement besoin de l'information "titre". – Robert