Jsoup unescapes特殊人物

dlv*_*dlv 5 html escaping character-encoding jsoup

我正在使用Jsoup从HTML页面中删除所有图像.我通过HTTP响应接收页面 - 它还包含内容字符集.

问题是Jsoup取消了一些特殊字符.

例如,输入:

<html><head></head><body><p>isn&rsquo;t</p></body></html>
Run Code Online (Sandbox Code Playgroud)

跑完之后

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>";
Document doc = Jsoup.parse(check);
System.out.println(doc.outerHtml());
Run Code Online (Sandbox Code Playgroud)

我明白了:

<html><head></head><body><p>isn’t</p></body></html><p></p>
Run Code Online (Sandbox Code Playgroud)

我想避免以任何其他方式更改html ,除了删除图像.

通过使用命令:

doc.outputSettings().prettyPrint(false).charset("ASCII").escapeMode(EscapeMode.extended);
Run Code Online (Sandbox Code Playgroud)

我确实得到了正确的输出,但我确信有些情况下,charset不会很好.我只想使用HTTP标头中指定的字符集,我担心这会以我无法预测的方式更改我的文档.有没有其他更清洁的方法来删除图像而不会无意中更改任何其他内容?

谢谢!

Ste*_*han 6

这是一种解决方法,除了 HTTP 标头中指定的字符集之外,不涉及任何字符集。

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>".replaceAll("&([^;]+?);", "**$1;");

Document doc = Jsoup.parse(check);

doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended);

System.out.println(doc.outerHtml().replaceAll("\\*\\*([^;]+?);", "&$1;"));
Run Code Online (Sandbox Code Playgroud)

输出

<html><head></head><body><p>isn&rsquo;t</p></body></html>
Run Code Online (Sandbox Code Playgroud)

讨论

我希望 Jsoup 的 API 中有一个解决方案- @dlv

使用 Jsoup'API 需要你编写一个自定义的 NodeVisitor。它会导致(重新)在 Jsoup 中发明一些现有的代码。自定义 Nodevisitor 会生成一个 HTML 转义码而不是 unicode 字符。

另一种选择是编写自定义字符编码器。默认的 UTF-8 字符编码器可以编码&rsquo;. 这就是 Jsoup 不在最终 HTML 代码中保留原始转义序列的原因。

以上两个选项中的任何一个都代表了大量的编码工作。最终,可以向 Jsoup 添加增强功能,让我们选择如何在最终 HTML 代码中生成字符:十六进制转义 ( &#AB;)、十进制转义 ( &#151;)、原始转义序列 ( &rsquo;) 或编写编码字符(就是这种情况)在您的帖子中)。

  • 我遇到了一个问题,客户的内容中有多个星号,并且此逻辑在内容中添加了不需要的&符号。我使用了不可见的 ASCII 31(单位分隔符)来代替星号字符 (*)。 (2认同)