【问题标题】:Jsoup Fine Grained ParseJsoup 细粒度解析
【发布时间】:2023-03-31 10:49:01
【问题描述】:

我正在尝试浏览网页正文上的每个 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 类”元素聚集在一起。如何以更细粒度的方式遍历 DOM 正文以查看每个标签的文本是什么?

提前谢谢你。

【问题讨论】:

  • 请更恰当地标记。这不是数据挖掘。阅读关于数据挖掘的维基百科文章。这只是web-scraping。数据挖掘是一种高级统计分析,而不是从网站读取数据。

标签: java web-scraping jsoup


【解决方案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
        }
    });

【讨论】:

    【解决方案2】:

    你可以使用this的方法

    在 traverse 里面你可以检查当前节点是否是 TextNode:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2019-03-28
      • 2023-04-11
      相关资源
      最近更新 更多