在html标签上删除Jsoup属性

时间:2013-08-14 14:03:52

标签: java jsoup

我有问题,我想过滤某些可能包含html的文本。 我使用jsoup白名单并清理工作非常好的标签。

我只有一些标签可以包含属性的问题,主要是样式或类,但也可能有不同的属性。 (名称,目标,等等)清洁时没有问题,因为它们被很好地剥离了,但是当将某些标签列入白名单时会因为属性而被阻止。基本的白名单似乎没有涵盖风格或类属性加上我不能保证我遇到的其他内容。

由于我想允许很多标签,但在清理过程中删除了大部分标签,我不想为我允许的所有标签添加所有属性。最简单的方法是从所有标签中删除所有属性,因为我对它们不感兴趣,然后检查带有普通标签的剥离文本是否有效。

是否有一个删除所有属性或一些简单循环的函数,另一个选项是告诉白名单忽略所有属性并简单地将标签列入白名单。

1 个答案:

答案 0 :(得分:16)

最终为我工作的解决方案非常简单。我遍历所有元素,然后遍历所有属性,然后在元素上删除它们,这留给我一个清理版本,我只需要验证html标签本身。我认为这不是解决问题的最佳方法,但它可以满足我的需求。

**编辑**

我为旧代码多次投票,而它实际上包含一个绝对的初学者错误。在迭代同一个列表时,您永远不能删除。 但是,只有在删除了多个属性时才会触发此错误。

使用bugFix更新代码:

Document doc = Jsoup.parseBodyFragment(aText);
Elements el = doc.getAllElements();
List<String>  attToRemove = new ArrayList<>();
for (Element e : el) {
    Attributes at = e.attributes();
    for (Attribute a : at) {
        attToRemove.add(a.getKey());
    }

    for(String att : attToRemove) {
        e.removeAttr(att);
    }
}

return Jsoup.isValid(doc.body().html(), theLegalWhitelist);