jSoup如何将匹配某些类模式的标签列入白名单?

时间:2016-03-21 08:43:26

标签: jsoup

我使用白名单如下:

           Document doc = Jsoup.parse(urls[0], 5000);
            if (doc != null){

                Whitelist wl = Whitelist.basicWithImages();
                // wl.preserveRelativeLinks(false);
                Cleaner cleaner = new Cleaner(wl);
                cleanedDoc=cleaner.clean(doc);
                if (cleanedDoc != null){
                   whiteListedHtml = cleanedDoc.html();
                }
            }
        }catch(IOException e){
           Log.d(TAG,"exception="+e.getMessage());
        }

现在这非常接近我想做的事情,除了: 有div标签,其类有" nav"或者" ad"并填写页面 带有红色。我想保留div标签,但不是如果班级碰巧有“导航”标签。或者' ad'出现在其中。

这让我想到了继承白名单...... RTFM http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html我明白了 addTag()和removeTag()(以某种方式removeTag()不可用,但这是另一个问题)。我真正想要做的是删除当且仅当标签的类包含刺激中的某些值,例如' ad'或者' nav'。 看起来充满希望的唯一方法是:

protected boolean isSafeTag(String tag)

Test if the supplied tag is allowed by this whitelist

Parameters:
    tag - test tag 
Returns:
    true if allowed 

那么我怎样才能拿出这个字符串的类值进行测试?无论如何在没有继承白名单的情况下进行此检查吗?

1 个答案:

答案 0 :(得分:0)

您可以做的一件事是手动删除<div class='ad'>之类的标签。首先,将div标记添加到白名单中(否则清理工具会删除它们)

 Whitelist wl = Whitelist
     .basicWithImages()
     .addTags("div");

之后,选择要删除的所有元素,然后......只需删除它们^^

doc
    .select("div[class=\"nav\"]")
    .forEach(e -> e.remove());

(您也可以使用通配符 - 请参阅selector-syntax

然后像你一样清理文档。

注意:你也可以反过来做 - 先清理,然后删除