Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jsoup.clean而不添加html实体_Java_Html_Jsoup_Html Entities - Fatal编程技术网

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))