我正在使用Jsoup从HTML页面中删除所有图像.
我通过HTTP响应接收页面 – 它还包含内容字符集.
我通过HTTP响应接收页面 – 它还包含内容字符集.
问题是Jsoup取消了一些特殊字符.
例如,输入:
<html><head></head><body><p>isn’t</p></body></html>
跑完之后
String check = "<html><head></head><body><p>isn’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);
我确实得到了正确的输出,但我确信有些情况下,charset不会很好.我只想使用HTTP标头中指定的字符集,我担心这会以我无法预测的方式更改我的文档.
有没有其他更清洁的方法来删除图像而不会无意中更改任何其他内容?
谢谢!
解决方法
除了在HTTP标头中指定的字符集之外,这是一个不涉及任何字符集的变通方法.
String check = "<html><head></head><body><p>isn’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;"));
OUTPUT
<html><head></head><body><p>isn’t</p></body></html>
讨论
@H_404_42@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;),十进制转义(—),原始转义序列(& ; rsquo;)或写入编码字符(在您的帖子中就是这种情况).