Jsoup.clean没有添加html实体

时间:2011-12-30 19:06:56

标签: java html jsoup html-entities

我正在使用

清除不需要的HTML标记(例如<script>)中的某些文字
String clean = Jsoup.clean(someInput, Whitelist.basicWithImages());

问题在于它用例如å代替&aring;(这会给我带来麻烦,因为它不是“纯xml”)。

例如

Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())

产量

"hello &aring;  world"

但我想

"hello å  world"

有没有简单的方法来实现这一目标? (即,比在结果中将&aring;转换回å更简单。)

7 个答案:

答案 0 :(得分:34)

您可以配置Jsoup的转义模式:使用EscapeMode.xhtml将为您提供无实体的输出。

这是一个完整的代码段,接受str作为输入,并使用Whitelist.simpleText()清除它:

// Parse str into a Document
Document doc = Jsoup.parse(str);

// Clean the document.
doc = new Cleaner(Whitelist.simpleText()).clean(doc);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string of the body.
str = doc.body().html();

答案 1 :(得分:10)

Jsoup的网站上已有功能请求。您可以通过添加新的空Map和新的转义类型来自己扩展源代码。如果您不想这样做,可以使用apache commons中的StringEscapeUtils。

public static String getTextOnlyFromHtmlText(String htmlText){
    Document doc = Jsoup.parse( htmlText );
    doc.outputSettings().charset("UTF-8");
    htmlText = Jsoup.clean( doc.body().html(), Whitelist.simpleText() );
    htmlText = StringEscapeUtils.unescapeHtml(htmlText);
    return htmlText;
}

答案 2 :(得分:4)

来自&amp; bmoc的答案工作正常,但您可以使用更短的解决方案:

// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))

答案 3 :(得分:2)

更简单的方法是

// clean the html
String output = Jsoup.clean(html, Whitelist.basicWithImages());

// Parse string into a document
Document doc = Jsoup.parse(output);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string
System.out.println(doc.body().html());

我测试了这个并且它可以正常工作

答案 4 :(得分:2)

接受的答案是使用Jsoup.parse,这看起来比Jsoup.clean在快速浏览一下来之后的重量级更重要。

我复制了Jsoup.clean(...)的源代码,并添加了一行来设置转义模式。这应该避免parse方法执行的一些不必要的步骤,因为它不必解析整个html文档而只是处理片段。

private String clean(String html, Whitelist whitelist) {
    Document dirty = Jsoup.parseBodyFragment(html, "");
    Cleaner cleaner = new Cleaner(whitelist);
    Document clean = cleaner.clean(dirty);
    clean.outputSettings().escapeMode(EscapeMode.xhtml);
    return clean.body().html();
}

答案 5 :(得分:0)

将HTML解析为文档,然后使用Cleaner清理文档并生成另一个文档,获取文档的outputSettings并将相应的charset和转义模式设置为xhtml,然后将文档转换为String。未经测试,但应该有效。

答案 6 :(得分:0)

简单方法:

EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();

doc.outputSettings().escapeMode(em);

这将删除所有 html实体,包括:',“,&amp;,&lt;和&gt; EscapeMode.xhtml 允许这些实体。