HTML混合编码?

时间:2011-09-28 14:48:58

标签: java html parsing encoding web-crawler

首先,我想提前感谢您的帮助。

我目前正在编写一个网络抓取工具,用于解析HTML内容,剥离HTML标记,然后拼写检查从解析中检索到的文本。

使用JSoup和Google拼写检查API,剥离HTML标记和拼写检查没有造成任何问题。

我能够从URL中下载内容并将此信息传递给byte [],然后最终传递给String,以便可以对其进行剥离和拼写检查。我遇到了字符编码问题。

例如,在解析http://www.testwareinc.com/ ...

原文:我们扩展了移动网络和移动应用测试服务。

...页面根据元标记使用ISO-8859-1 ...

ISO-8859-1 Parse:我们扩展了移动网络和移动应用测试服务。

...然后尝试使用UTF-8 ......

UTF-8 Parse:我们扩展了移动网络和移动应用测试服务。

问题 的 网页的HTML是否可能包含多种编码?怎么能被发现呢?

4 个答案:

答案 0 :(得分:2)

看起来撇号被编码为0x92字节,根据Wikipedia,它是未分配的/私有代码点。

从那时起,看起来浏览器会假设它是一个非编码的1字节Unicode代码点而退回:+0092 Private Use Two )似乎代表了作为撇号。没有等待,如果它是一个字节,则更可能是cp1252:浏览器必须根据所宣传的CP具有回退策略,例如ISO-8859-1 - > CP1252。

因此,这里没有混合编码,但正如其他人所说的那样。但是后备启发式有时会有所帮助,有时候却没有。

如果您有足够的好奇心,可能需要深入了解FF或Chrome的源代码,以确切了解他们在这种情况下的行为。

答案 1 :(得分:1)

在文档中有多个编码不是混合文档,它是一个破碎的文档。

不幸的是,有很多网页使用的编码与文档定义不匹配,或者包含一些在给定编码中有效的数据和一些无效的内容。

没有好办法处理这个问题。可以尝试猜测文档的编码,但这很难并且不是100%可靠。在像您这样的情况下,最简单的解决方案就是忽略无法解码的文档部分。

答案 2 :(得分:0)

Apache Tika有一个编码检测器。如果您需要C ++中的某些东西并且能够花钱,那么也有商业选择。

我几乎可以保证每个网页都采用一个编码,但很容易被误认为是哪一个

答案 3 :(得分:-2)

似乎与特殊字符有关。检查此StringEscapeUtils.escapeHtml是否有帮助。或任何方法

编辑:添加了这个逻辑,因为他无法使代码工作

public static void main(String[] args) throws FileNotFoundException {
        String asd = "’";
        System.out.println(StringEscapeUtils.escapeXml(asd)); //output - ’
    System.out.println(StringEscapeUtils.escapeHtml(asd)); //output - ’
}