JSOUP 处理一段标准的html内容,怎么样才能保留<html>这个tag呢。

蓝水晶飞机 发布于 2015/08/20 10:17
阅读 844
收藏 1

经过JSOUP clean处理之后,保存的html都是缺少<html>标记的。

.addTags("html", "head", "style", "body", "link")



上面这个设置并没什么用处。

处理保存的文件内容是这样的:

Cleaner.java 43行:

public Document clean(Document dirtyDocument) {
        Validate.notNull(dirtyDocument);

        Document clean = Document.createShell(dirtyDocument.baseUri());
        if (dirtyDocument.body() != null) // frameset documents won't have a body. the clean doc will have empty body.
            copySafeNodes(dirtyDocument.body(), clean.body());

        return clean;
    }



看不怎么明白。


加载中
1
铂金小鸟
铂金小鸟

因为jsoup的clean 压根就只过滤 body里面的内容,这一点从他Cleaner类的clean方法中就可以看出来


public Document clean(Document dirtyDocument) {
        Validate.notNull(dirtyDocument);
        Document clean = Document.createShell(dirtyDocument.baseUri());
        if(dirtyDocument.body() != null) {
            this.copySafeNodes(dirtyDocument.body(), clean.body());
        }

        return clean;
}



再看看jsoup的clean方法:



public static String clean(String bodyHtml, String baseUri, Whitelist whitelist) {
        Document dirty = parseBodyFragment(bodyHtml, baseUri);
        Cleaner cleaner = new Cleaner(whitelist);
        Document clean = cleaner.clean(dirty);
        return clean.body().html();
    }


注意最后一句代码 压根就只给你返回了clean.body().html(),所以无论你怎么配置Whitelist也是然并卵的

如果要保留 除body的内容也很简单,把他clean代码拿出来改一下就ok了。

public static String clean(String bodyHtml, String baseUri, Whitelist whitelist) {
        Document dirty = parseBodyFragment(bodyHtml, baseUri);
        Cleaner cleaner = new Cleaner(whitelist);
        Document clean = cleaner.clean(dirty);
        return clean.html();
    }

    public static String clean(String bodyHtml, Whitelist whitelist) {
        return clean(bodyHtml, "", whitelist);
    }



ok了。直接调用下面自己改的clean而不是jsoup的clean。

蓝水晶飞机
蓝水晶飞机
嘎嘎。。。谢谢哦。
0
蓝水晶飞机
蓝水晶飞机
求教咯。。。
0
LucEsape
LucEsape
最近的方法:自己添加不行吗?
蓝水晶飞机
蓝水晶飞机
虽然可以解决这个问题,治根不治本吧。
0
蓝水晶飞机
蓝水晶飞机
<head>也被过滤了哎。
0
蓝水晶飞机
蓝水晶飞机

补充下我的测试:

测试代码和结果:

配置Whitelist代码:

到底是什么原因呢?有什么我还不知道的奥秘

0
蓝水晶飞机
蓝水晶飞机

我暂时是这么解决的:

@Test
    public void test3() {
        Document document = org.jsoup.parser.Parser.parse(content, "");
        String headContent = document.head().html();
        String bodyContent = document.body().html();
//        System.out.println(headContent);
//        System.out.println("------------------------------------------------------------");
//        System.out.println(bodyContent);
        headContent = Jsoup.clean(headContent, NewsContentWhitelist.custom());
        bodyContent = Jsoup.clean(bodyContent, NewsContentWhitelist.custom());
        Document outputDoc = Document.createShell("");
        outputDoc.head().append(headContent);
        outputDoc.body().append(bodyContent);
        System.out.println(outputDoc.toString());
    }



将head和body的html分别拿出来clean,然后再设置到另一个document。

返回顶部
顶部