Java Jsoup.clean而不添加html实体
我正在使用 问题在于,它用Java Jsoup.clean而不添加html实体,java,html,jsoup,html-entities,Java,Html,Jsoup,Html Entities,我正在使用 问题在于,它用替换了å(这给我带来了麻烦,因为它不是“纯xml”) 比如说 Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages()) 但是我想 "hello å world" 有没有一个简单的方法来实现这一点?(即,比在结果中将å;转换回å更简单。)将HTML解析为文档,然后使用清理器清理文档并生成另一个文档,获取文档的输出设置并将适当的字符集和转义模
替换了å
代码>(这给我带来了麻烦,因为它不是“纯xml”)
比如说
Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())
但是我想
"hello å world"
有没有一个简单的方法来实现这一点?(即,比在结果中将å;
转换回å
更简单。)将HTML解析为文档,然后使用清理器清理文档并生成另一个文档,获取文档的输出设置并将适当的字符集和转义模式设置为xhtml,然后将文档转换为字符串。未测试,但应能正常工作。Jsoup网站上已经有功能请求。您可以通过添加新的空映射和新的转义类型来扩展源代码。如果不想这样做,可以使用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;
}
您可以配置Jsoup的转义模式:使用EscapeMode.xhtml
将为您提供不带实体的输出
下面是一个完整的代码段,它接受str
作为输入,并使用Whitelist.simpleText()清理它:
一个更简单的方法是
// 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());
我已经对此进行了测试,并且效果良好公认的答案是使用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();
}
简单方法:
EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();
doc.outputSettings().escapeMode(em);
这将删除所有html实体,包括以下内容:&apos;,“,&,<和>。EscapeMode.xhtml允许这些实体。来自&bmoc的回答可以正常工作,但您可以使用一个较短的解决方案:
// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))
用StringEscapeUtils方法很好,Frank。非常有用,不仅在这方面case@frandevel这将是一个非常糟糕的主意。如果输入是scriptalert('Hello')/script
,您将实际插入不安全的HTML并允许XSS攻击。此功能现在在Jsoup中实现。请参阅Parser.unescapeEntities,@GuillaumePolet有趣的一点,然后如何清理类似于以下内容的输入:scriptalert('Hello');/script
?注意:与直接交互,而不是在Jsoup中使用。
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();
}
EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();
doc.outputSettings().escapeMode(em);
// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))