Jsoup 转义特殊字符

Jsoup unescapes special characters

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

问题是 Jsoup 转义了一些特殊字符。

例如,对于输入:

<html><head></head><body><p>isn&rsquo;t</p></body></html>

运行

之后
String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>";
Document doc = Jsoup.parse(check);
System.out.println(doc.outerHtml());

我得到:

<html><head></head><body><p>isn’t</p></body></html><p></p>

我想避免以除删除图像以外的任何其他方式更改 html

通过使用命令:

doc.outputSettings().prettyPrint(false).charset("ASCII").escapeMode(EscapeMode.extended);

我确实得到了正确的输出,但我确信在某些情况下该字符集不会很好。我只想使用 HTTP header 中指定的字符集,我担心这会以我无法预料的方式更改我的文档。 有没有其他更干净的方法可以删除图像而不会无意中更改任何其他内容?

谢谢!

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

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

Document doc = Jsoup.parse(check);

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

System.out.println(doc.outerHtml().replaceAll("\*\*([^;]+?);", "&;"));

输出

<html><head></head><body><p>isn&rsquo;t</p></body></html>

讨论

I wish there was a solution in Jsoup's API - @dlv

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

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

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