Java 使用Jsoup删除不包含自己文本的节点
我注意到很多网页都有多余的html节点。我想从页面中删除它们,因为这会使我的处理变得更容易 有没有办法用JSoup来实现这一点 为了让情况更清楚,假设我们有以下页面: 我有一些文字 我也有文本 我也有文本 我想删除class='无用的'div,但当然,我不能仅凭class='无用的'div的class='id/标签等来选择它们,因为它们没有内容。这当然会改变页面的结构,这是完全好的-这将使我的最终处理更容易 结果将是: 我有一些文字 我也有文本 我也有文本 这可能是简单的还是困难的 结果将是: 我有一些文字 我也有文本 我也有文本 现在我想不出有什么特别优雅的。我通常倾向于检查各个元素上的ownText方法将检查ownText.length>0,如果为false,则尝试删除它们,但我认为这也会删除任何子/子元素,即使它们与.ownText条件匹配为true。您可以使用Document.getAllegements并检查每个元素是否具有ownText。如果它什么也没做。如果没有,请将所有子节点附加到父节点(如果有)。这应该可以做到:Java 使用Jsoup删除不包含自己文本的节点,java,web-scraping,jsoup,Java,Web Scraping,Jsoup,我注意到很多网页都有多余的html节点。我想从页面中删除它们,因为这会使我的处理变得更容易 有没有办法用JSoup来实现这一点 为了让情况更清楚,假设我们有以下页面: 我有一些文字 我也有文本 我也有文本 我想删除class='无用的'div,但当然,我不能仅凭class='无用的'div的class='id/标签等来选择它们,因为它们没有内容。这当然会改变页面的结构,这是完全好的-这将使我的最终处理更容易 结果将是: 我有一些文字 我也有文本 我也有文本 这可能是简单的还是困难的 结果将是:
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标记并不重要。您描述的附加包含文本的标记的方法非常适合我需要做的事情。