2012-04-16 22 views
7

Ich brauche Text von einem Knoten wie folgt zu extrahieren:Jsoup - Extrahieren von Text

<div> 
    Some text <b>with tags</b> might go here. 
    <p>Also there are paragraphs</p> 
    More text can go without paragraphs<br/> 
</div> 

Und ich brauche zu bauen:

Some text <b>with tags</b> might go here. 
Also there are paragraphs 
More text can go without paragraphs 

Element.text kehrt nur alle Inhalte des div. Element.ownText - alles, was nicht in Kinderelementen ist. Beide sind falsch. Iterieren durch children ignoriert Textknoten.

Gibt es Möglichkeiten, den Inhalt eines Elements auch zum Empfangen von Textknoten zu iterieren. Z.B.

  • Textknoten - Einige Text
  • Knoten < b> - mit Tags
  • Textknoten - könnte hier.
  • Knoten < p> - Auch gibt es Absätze
  • Text Knoten - Mehr Text ohne Absätze gehen
  • Knoten < br> - < leer>

Antwort

11

Element.children() gibt ein Elements Objekt - eine Liste der Element Objekte. Wenn Sie die übergeordnete Klasse Node betrachten, sehen Sie Methoden, mit denen Sie auf beliebige Knoten zugreifen können, nicht nur auf Elemente wie Node.childNodes().

public static void main(String[] args) throws IOException { 
    String str = "<div>" + 
      " Some text <b>with tags</b> might go here." + 
      " <p>Also there are paragraphs</p>" + 
      " More text can go without paragraphs<br/>" + 
      "</div>"; 

    Document doc = Jsoup.parse(str); 
    Element div = doc.select("div").first(); 
    int i = 0; 

    for (Node node : div.childNodes()) { 
     i++; 
     System.out.println(String.format("%d %s %s", 
       i, 
       node.getClass().getSimpleName(), 
       node.toString())); 
    } 
} 

Ergebnis:

 
1 TextNode 
Some text 
2 Element <b>with tags</b> 
3 TextNode might go here. 
4 Element <p>Also there are paragraphs</p> 
5 TextNode More text can go without paragraphs 
6 Element <br/> 
+0

funktioniert perfekt, danke! –

3
for (Element el : doc.select("body").select("*")) { 

     for (TextNode node : el.textNodes()) { 

        node.text())); 

     } 

    } 
1

Angenommen, Sie möchten Text nur (keine Tags) meine Lösung ist unten.
Ausgabe ist:
Einige Text mit Tags möglicherweise hier gehen. Auch dort sind Absätze. Mehr Text kann

public static void main(String[] args) throws IOException { 
    String str = 
       "<div>" 
      + " Some text <b>with tags</b> might go here." 
      + " <p>Also there are paragraphs.</p>" 
      + " More text can go without paragraphs<br/>" 
      + "</div>"; 

    Document doc = Jsoup.parse(str); 
    Element div = doc.select("div").first(); 
    StringBuilder builder = new StringBuilder(); 
    stripTags(builder, div.childNodes()); 
    System.out.println("Text without tags: " + builder.toString()); 
} 

/** 
* Strip tags from a List of type <code>Node</code> 
* @param builder StringBuilder : input and output 
* @param nodesList List of type <code>Node</code> 
*/ 
public static void stripTags (StringBuilder builder, List<Node> nodesList) { 

    for (Node node : nodesList) { 
     String nodeName = node.nodeName(); 

     if (nodeName.equalsIgnoreCase("#text")) { 
      builder.append(node.toString()); 
     } else { 
      // recurse 
      stripTags(builder, node.childNodes()); 
     } 
    } 
} 
1

ohne Absätze gehen Sie TextNode für diesen Zweck verwenden können:

List<TextNode> bodyTextNode = doc.getElementById("content").textNodes(); 
    String html = ""; 
    for(TextNode txNode:bodyTextNode){ 
     html+=txNode.text(); 
    }