【问题标题】:What html parser is able to handle encoding?什么 html 解析器能够处理编码?
【发布时间】:2011-12-29 13:50:22
【问题描述】:

这是开始——我在磁盘上有一个文件,它是 HTML 页面。当我使用常规网络浏览器打开它时,它会按原样显示 - 即无论使用什么编码,我都会看到正确的国家字符。

然后我来了——我的任务是加载同一个文件,解析它,然后在屏幕(控制台)上打印出一些片段——比如说,所有的 文本。当然,我只想看到正确的字符,而不是一些 mambo-jumbo。最后一步是更改一些文本,然后保存文件。

因此解析器也必须以两种方式解析和处理编码。到目前为止,我还不知道解析器甚至能够正确加载数据。

问题

你会推荐什么解析器?

详情

HTML 页面通常具有标头(在元标记中)中给出的编码,因此解析器应该使用它。我必须提前查看并检查编码,然后在代码中手动设置编码的场景是行不通的。例如,这是取自 JSoup 教程:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

我不能这样做,解析器必须自己处理编码检测。


在 C# 中,我在加载 html 时遇到了类似的问题。我使用 HTMLAgilityPack 并首先执行编码检测,然后使用它对数据流进行编码,然后解析数据。所以,我明确地做了这两个步骤,但由于库提供了这两种方法,所以我觉得很好。

这样的显式分离可能会更好,因为它可以在缺少标头概率编码检测方法的情况下使用。

【问题讨论】:

    标签: java html encoding html-parsing


    【解决方案1】:

    Jsoup API 参考针对该解析方法说,如果您提供null 作为第二个参数(编码参数),它将使用http-equiv 元标记来确定编码。所以看起来它已经做了“解析一下,确定编码,用正确的编码重新解析”例程。通常,此类解析器应该能够使用任何可用的方式自行解析编码。我知道 Java 中的 SAX 解析器应该使用字节顺序标记和 XML 声明来尝试建立编码。

    如果没有找到合适的元标记,显然 Jsoup 将默认为 UTF-8。正如他们在文档中所说,这“通常是安全的”,因为 UTF-8 与较低代码点的许多常见编码兼容。但我认为“通常安全”在这种情况下可能还不够好。

    如果您不充分信任 Jsoup 来检测编码,我会看到两种选择:

    • 如果您以某种方式确定 HTML 实际上始终是 XHTML,那么 XML 解析器可能会更合适。但这只有在输入绝对符合 XML 的情况下才有效。
    • 自己进行启发式编码检测,尝试使用字节顺序标记,使用通用编码解析一部分并找到元标记,通过标题标记中预期的字节模式检测编码,最后,所有其他方法都失败了, 使用默认值。

    【讨论】:

    • 不,不,这不是信任问题,我只是看到硬编码的 UTF8 被关闭了。稍后我会检查它,非常感谢!我已经尝试过 TagSoup+scala.XML,但是我没有看到任何编码检测的地方,并且默认值被破坏(即国家字符显示不正确)。 更新:我测试过,效果很好。再次感谢您。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多