Jsoup反转义特殊字符

9
我会用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头中指定的字符集,但我担心这样会以我无法预测的方式更改我的文档。虽然我确实可以得到正确的输出,但我确信在某些情况下该字符集可能不合适。有没有其他更干净的方法可以删除图像,而不会无意间更改任何其他内容?谢谢!
1个回答

8
这里有一个解决方案,不涉及除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;"));

输出

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

讨论

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

使用 Jsoup 的 API 需要编写自定义的 NodeVisitor。这将导致在 Jsoup 内部重新发明一些现有的代码。自定义 NodeVisitor 将生成 HTML 转义代码而不是 Unicode 字符。

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

以上两种选项都代表了大量的编码工作。最终,Jsoup 可以进行改进,让我们选择如何在最终的 HTML 代码中生成字符:十六进制转义(&#AB;),十进制转义(&#151;),原始转义序列(&rsquo;)或编写编码字符(在您的帖子中的情况)。


谢谢,我现在会使用这个,尽管我希望Jsoup的API中有一个解决方案。 - dlvhdr
1
@Ravisha,您可以在此页面的“新功能”部分找到此信息:https://jsoup.org/download。 - Stephan
2
我遇到了一个问题,客户的内容中有多个星号,这个逻辑会在内容前缀添加不需要的和号。为了解决这个问题,我使用了一个不可见的ASCII 31(单元分隔符)代替星号字符(*)。 - James Moberg
我的文本包含数字实体,例如à,而该方法会将它们替换为HTML实体,例如à。有没有什么办法可以避免这种情况发生? - Alexis Dufrenoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接