Jsoup Fine Grained Parse

时间:2012-04-26 13:00:42

标签: java web-scraping jsoup

我正在尝试遍历网页主体上的每个html标记,并查看其中是否包含文字。如果是的话,我希望打印出该文本:

  Document doc = Jsoup.connect(site).get();     
    Elements e = doc.body().getAllElements();
      for (int i=0; i<e.size(); i++){
         if(doc.body().child(i).hasText()){
        System.out.println(doc.body().child(i).text());
          }
       }

以上作品,但不是我想要的。似乎child()方法没有细粒度,因为它将多个'div class'元素聚集在一起。如何以更细粒度的方式遍历DOMs Body以查看每个标记的文本是什么?

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

您可以使用this方法

在遍历内部,您可以检查当前节点是否为TextNode:

if(node intanceof TextNode) {
  System.out.println(node.text());
}

如果您尝试打印出所有文字。为什么你不使用text()类的Elements

答案 1 :(得分:1)

    Document doc = Jsoup.connect(site).get();
    doc.body().traverse(new NodeVisitor() {

        @Override
        public void head(Node node, int depth) {
            if (node instanceof TextNode) {
                TextNode tn = ((TextNode) node);
                // Try to improve this filter for the nodes who contain
                // texts with a whitespaces
                if (tn.text().replaceAll("\\s*", "").length() > 0) {
                    System.out.println("Tag:" + tn.parent().nodeName()
                            + ", text:" + tn.text());
                }
            }
        }

        @Override
        public void tail(Node node, int depth) {
            // Do Nothing
        }
    });