【问题标题】:jSoup How to Whitelist tags matching certain class patterns?jSoup如何将匹配某些类模式的标签列入白名单?
【发布时间】:2016-07-07 16:24:56
【问题描述】:

我使用白名单如下:

           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());
        }

现在这与我想做的非常接近,除了: 有类具有“nav”或“ad”的 div 标签正在填充页面 垃圾。例如,我想保留 div 标签,但如果类碰巧出现“导航”或“广告”,则不保留。

这让我想到了子类化白名单...... RTFM http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html 我明白了 addTag() 和 removeTag() (不知何故 removeTag() 不可用,但那是另一个问题)。我真正想要做的是当且仅当标签的类在字符串中包含某些值(例如“广告”或“导航”)时才删除。 唯一看起来有希望的方法是:

protected boolean isSafeTag(String tag)

Test if the supplied tag is allowed by this whitelist

Parameters:
    tag - test tag 
Returns:
    true if allowed 

那么如何提取这个字符串的类值进行测试呢?无论如何都可以在不子类化白名单的情况下进行此检查?

【问题讨论】:

    标签: jsoup


    【解决方案1】:

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

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

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

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

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

    然后像你一样清理文档。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2014-04-22
      • 2017-10-26
      相关资源
      最近更新 更多