Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jsoup删除不包含自己文本的节点_Java_Web Scraping_Jsoup - Fatal编程技术网

Java 使用Jsoup删除不包含自己文本的节点

Java 使用Jsoup删除不包含自己文本的节点,java,web-scraping,jsoup,Java,Web Scraping,Jsoup,我注意到很多网页都有多余的html节点。我想从页面中删除它们,因为这会使我的处理变得更容易 有没有办法用JSoup来实现这一点 为了让情况更清楚,假设我们有以下页面: 我有一些文字 我也有文本 我也有文本 我想删除class='无用的'div,但当然,我不能仅凭class='无用的'div的class='id/标签等来选择它们,因为它们没有内容。这当然会改变页面的结构,这是完全好的-这将使我的最终处理更容易 结果将是: 我有一些文字 我也有文本 我也有文本 这可能是简单的还是困难的 结果将是:

我注意到很多网页都有多余的html节点。我想从页面中删除它们,因为这会使我的处理变得更容易

有没有办法用JSoup来实现这一点

为了让情况更清楚,假设我们有以下页面:

我有一些文字 我也有文本 我也有文本 我想删除class='无用的'div,但当然,我不能仅凭class='无用的'div的class='id/标签等来选择它们,因为它们没有内容。这当然会改变页面的结构,这是完全好的-这将使我的最终处理更容易

结果将是:

我有一些文字 我也有文本 我也有文本 这可能是简单的还是困难的

结果将是:

我有一些文字 我也有文本 我也有文本 现在我想不出有什么特别优雅的。我通常倾向于检查各个元素上的ownText方法将检查ownText.length>0,如果为false,则尝试删除它们,但我认为这也会删除任何子/子元素,即使它们与.ownText条件匹配为true。

您可以使用Document.getAllegements并检查每个元素是否具有ownText。如果它什么也没做。如果没有,请将所有子节点附加到父节点(如果有)。这应该可以做到:

Document document = Jsoup.parse(html);
document.getAllElements().stream()
        .filter(e -> e.ownText().isEmpty())
        .filter(Element::hasParent)
        .forEach(e -> {
            e.children().forEach(e.parent()::appendChild);
            e.remove();
        });
您共享的代码的结果如下:

我有一些文字 我也有文本 我也有文本 正如我在comments with your ownText规则中提到的,html、head和body元素也应该被删除

如果要防止删除某些特殊标记,可以使用一个简单的集合或列表,其中包含应保留的标记名称:

Set<String> retainTagNames = new HashSet<>(Arrays.asList("html", "body"));
Document document = Jsoup.parse(html);
document.getAllElements().stream()
        .filter(e -> ! retainTagNames.contains(e.tagName()))
        .filter(e -> e.ownText().isEmpty())
        .filter(Element::hasParent)
        .forEach(e -> {
            e.children().forEach(e.parent()::appendChild);
            e.remove();
        });
其结果将是:

我有一些文字 我也有文本 我也有文本
使用您自己的text.length>0规则,html、head和body标记也应该被删除,还是我错了?对于我来说,删除html和body标记并不重要。您描述的附加包含文本的标记的方法非常适合我需要做的事情。