Jsoup。按顺序打印所有文本节点

时间:2017-11-15 16:16:51

标签: java jsoup textnode

我想用Jsoup解析这个(这是一个简化,我会解析整个网页)

<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>

按照它们出现的顺序获取所有文本元素,这是:

A B C D E

我尝试了两种方法:

Elements elements = doc.children().select("*");
for (Element el : elements)
    System.out.println(el.ownText());

返回:

A C E B D

这就是“强”标签之间的元素结尾。

我也尝试了一个递归版本:

myfunction(doc.children());

private void myfunction(Elements elements) {
  for (Element el : elements){
    List<Node> nodos = el.childNodes();       
    for (Node nodo : nodos) {                
      if (nodo instanceof TextNode && !((TextNode) nodo).isBlank()) {
      System.out.println(((TextNode) nodo).text()); 
    }
  }
  myfunction(el.children());
} 

但结果和以前一样。

如何实现这一目标?我觉得我很难做到简单......

2 个答案:

答案 0 :(得分:1)

怎么样:

private static void myfunction(Node element) {
    for (Node n : element.childNodes()) {
        if (n instanceof TextNode && !((TextNode) n).isBlank()) {
            System.out.println(((TextNode) n).text());
        } else {
            myfunction(n);
        }
    }
}

演示:

String html = "<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>";
Document doc = Jsoup.parse(html);
myfunction(doc.body());

输出:

A
B
C
D
E

答案 1 :(得分:1)

text()方法可以解决这个问题,例如以下

    public static void main(String[] args) {
            Document doc = Jsoup.parse("<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>");
            String texts = doc.body().text();
            System.out.println(texts);
   }