2012-04-11 4 views
7

Penso che questa domanda sia stata fatta, ma non ho trovato nulla.Come posso attraversare l'albero HTML usando Jsoup?

Dall'elemento Document in Jsoup, come posso attraversare tutti gli elementi nel contenuto HTML?

Stavo leggendo la documentazione e stavo pensando di usare il metodo childNodes(), ma prende solo i nodi da un livello inferiore di seguito (ciò che capisco). Penso di poter usare qualche ricorsione con questo metodo, ma voglio sapere se c'è un modo più appropriato/nativo per farlo.

risposta

18

Da Document (e qualsiasi sottoclasse Node), è possibile utilizzare il metodo traverse(NodeVisitor).

Ad esempio:

document.traverse(new NodeVisitor() { 
    public void head(Node node, int depth) { 
     System.out.println("Entering tag: " + node.nodeName()); 
    } 
    public void tail(Node node, int depth) { 
     System.out.println("Exiting tag: " + node.nodeName()); 
    } 
}); 
-1

È possibile utilizzare il seguente codice:

public class JsoupDepthFirst { 

    private static String htmlTags(Document doc) { 
     StringBuilder sb = new StringBuilder(); 
     htmlTags(doc.children(), sb); 
     return sb.toString(); 
    } 

    private static void htmlTags(Elements elements, StringBuilder sb) { 
     for(Element el:elements) { 
      if(sb.length() > 0){ 
       sb.append(","); 
      } 
      sb.append(el.nodeName()); 
      htmlTags(el.children(), sb); 
      sb.append(",").append(el.nodeName()); 
     } 
    } 

    public static void main(String... args){ 
     String s = "<html><head>this is head </head><body>this is body</body></html>"; 
     Document doc = Jsoup.parse(s); 
     System.out.println(htmlTags(doc)); 
    } 
} 
0

1) È possibile selezionare tutti gli elementi del documento utilizzando * selettore.

Elements elements = document.body().select("*"); 

2) Per recuperare il testo di ogni singolo utilizzando il metodo Element.ownText().

for (Element element : elements) { 
    System.out.println(element.ownText()); 
} 

3) Per modificare il testo di ogni singolo utilizzando Element.html (String strHtml). (cancella qualsiasi HTML interno esistente in un elemento e lo sostituisce con HTML analizzato.)

element.html(strHtml); 

Spero che questo ti possa aiutare. Grazie!