Java HTML混合编码?

Java HTML混合编码?,java,html,parsing,encoding,web-crawler,Java,Html,Parsing,Encoding,Web Crawler,首先,我想对你的帮助表示感谢 我目前正在编写一个web爬虫,它解析HTML内容,剥离HTML标记,然后对从解析中检索到的文本进行拼写检查 使用JSoup和Google拼写检查API剥离HTML标记和拼写检查并没有造成任何问题 我能够从URL中提取内容,并将这些信息传递到一个字节[],然后最终传递到一个字符串中,以便对其进行剥离和拼写检查。我遇到了字符编码的问题 例如,在解析时 原文:我们已经扩展了我们的移动网络和移动应用测试服务 。。。该网页是使用ISO-8859-1根据元标签 ISO-8859

首先,我想对你的帮助表示感谢

我目前正在编写一个web爬虫,它解析HTML内容,剥离HTML标记,然后对从解析中检索到的文本进行拼写检查

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

我能够从URL中提取内容,并将这些信息传递到一个字节[],然后最终传递到一个字符串中,以便对其进行剥离和拼写检查。我遇到了字符编码的问题

例如,在解析时

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

。。。该网页是使用ISO-8859-1根据元标签

ISO-8859-1解析:我们已经扩展了我们的移动Web和移动应用程序测试服务

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

UTF-8解析:We�我们扩展了我们的移动网络和移动应用测试服务

问题
网页的HTML是否可能包含混合编码?如何检测到这种情况?

一个文档中有多个编码不是混合文档,而是一个已损坏的文档

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


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

似乎是特殊字符的问题。如果有帮助,请检查此项。或者有什么办法

编辑:添加此逻辑,因为他无法使代码正常工作

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

ApacheTika有一个编码检测器。也有商业选择,如果你需要,比如说C++中的东西,可以花钱。p>
我几乎可以保证每个网页都采用一种编码方式,但很容易错误地判断是哪种编码方式。

看起来撇号被编码为0x92字节,这是一个未分配/专用代码点

从那以后,浏览器似乎会后退,假定它是一个非编码的1字节Unicode代码点:(Private Use Two),它似乎表示为撇号。不,等等,如果是一个字节,则更可能是:浏览器必须根据公布的CP具有回退策略,例如ISO-8859-1->CP1252

因此,这里没有混合编码,但正如其他人所说,这是一个损坏的文档。但有一个后备启发,有时会有帮助,有时不会


如果你够好奇的话,你可能想深入了解FF或Chrome的源代码,看看它们在这种情况下到底做了什么。

处理文本很糟糕。祝你好运快速浏览(仅在浏览器中,而不是在十六进制编辑器中),该字符看起来像一个有效的ISO-8559-1字符。你为什么认为这里有两种编码?难道你的解析器不可能简单地吞下这个字符吗?谢谢cdeszaq,我已经在这个爬虫程序上工作了6个月了,解析是唯一一个每次都给我带来麻烦的部分,但我知道它会在“野外”出现不同站点的HTML可能会有很大的不同。我认为CP1252和ISO-8859-1是在相互玩游戏。我使用了juniversalchardet,如下所述,它通知我页面上的内容实际上不是ISO-8859-1。如果我有点松懈的话,至少我可以找到我应该用什么来获取尽可能多的数据。哦,好吧。谢谢你的回复,不幸的是,这正是我所害怕的。看起来我将能够使用juniversalchardet以一定的精度检测编码。但我相信即使这样也会引起一些问题。例如,使用juniversalchardet发现HTML使用的是cp1252,而不是元标记中概述的ISO-8859-1。再次感谢@丹尼尔:奇怪的是,人们认为解决问题的唯一办法就是调查问卷的目的。你可以等他说这对他来说不是一个解决方案,然后再否定一个答案。没有任何逃避都是行不通的。我试过了。在源代码中,撇号编码为撇号,而不是HTML;所以不,这不起作用。@spitpsu请检查您的编码。我尝试了逻辑,得到了如上所示的输出。从问题中复制您的角色,然后重试逻辑或使用我的代码。代码运行良好。如果答案对你有效,请接受。你的问题已经花了我4英镑points@Daniel希望你看到逻辑也可以通过我的方式实现:PBabu,我完全理解是的,你第一次执行的代码是正确的,逻辑没有问题。我只是说你给的答案不是这个问题的正确答案。我问了一个关于分析HTML文档的字符集的问题,而不是如何转换特定字符,我提供的URL只是一个示例。运行juniversalchardet时您是对的,我看到页面实际上是CP1252,而不是元标记中设置的ISO-8859-1。当使用CP1252作为字符集解码输入流时,撇号显示正确。我同意我决定使用juniversalchardet。它似乎工作得很好。如果juniversalchardet找不到字符集,我可能想研究一种使用meta标记作为后备的方法。