HTML混合编码?
首先我想先说谢谢你的帮助。HTML混合编码?
我目前正在编写一个网络爬虫,它解析HTML内容,去除HTML标签,然后拼写检查从解析中检索到的文本。
使用JSoup和Google Spell Check API剥离HTML标记和拼写检查没有造成任何问题。
我能够从URL中拉下内容并将这些信息传递到一个字节[]中,然后最终生成一个字符串,以便它可以被剥离和拼写检查。我遇到了字符编码的问题。
例如解析http://www.testwareinc.com/当...
原始文本:我们已经扩大我们的移动网络和移动应用测试服务。
...页面根据meta标签使用ISO-8859-1 ...
ISO-8859-1解析:我们促成扩大了我们的移动网络和移动应用测试服务。
...然后使用UTF-8 ...
UTF-8解析尝试:我们促成扩大了我们的移动网络和移动应用测试服务。
问题 有没有可能是网页的HTML可以包括编码的混合体?那么如何检测?
在文档中编码超过1个不是混合文档,它是一个破碎的文档。
不幸的是,有很多网页使用与文档定义不匹配的编码,或者包含一些在给定编码中有效的数据和一些无效的内容。
没有好办法来处理这个问题。可以尝试猜测文档的编码,但这很困难,而且不是100%可靠的。在像您这样的情况下,最简单的解决方案就是忽略无法解码的文档部分。
感谢您的回复,不幸的是,这是我所害怕的。它看起来像我将能够使用juniversalchardet以一定的准确度检测编码。但我相信即使这会导致问题。例如,使用juniversalchardet发现HTML使用cp1252而不是meta标签中概述的ISO-8859-1。再次感谢! – mikesalvia
好像是特殊字符的问题。如果有帮助,请检查此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 - ’
}
@daniel奇怪的是,人们认为问题的唯一解决方案就是问卷的内容。你可能已经等待他评论,在你否定答案之前,这对他来说不是一个解决方案。 –
否StringEscapeUtils不起作用。我努力了。在源代码中,撇号被编码为撇号,而不是HTML ’,所以不会出现这种情况。 – mikesalvia
@spitpsu请检查你的编码。我尝试了逻辑,并得到了如上所示的输出。从问题中复制您的角色,然后再次尝试逻辑或使用我的代码。代码工作精美。如果它适合你,请接受答案。你的问题已经花了我4分 –
阿帕奇提卡具有编码检测器。如果你需要C++中的某些东西,并且能够花钱,还有其他商业选择。
我几乎可以保证每个网页是一个编码,但它很容易被误认为约哪一个。
我同意我决定和juniversalchardet一起去。它似乎运作良好。如果juniversalchardet找不到字符集,我可能想要调查一种使用元标记作为回退的方法。 – mikesalvia
它看起来像撇号编码为0x92字节,根据Wikipedia是一个未分配/私有代码点。
从那里,它看起来像浏览器假定这是一个非编码的1个字节的Unicode代码点回落:+0092(私人使用两个),这似乎被表示为一个单引号。无需等待,如果它是一个字节,则更可能是cp1252:浏览器必须根据广告的CP(例如ISO-8859-1 - > CP1252)制定回退策略。
因此,没有编码这里但作为其他组合表示一个破碎的文件。但是有时候会有所帮助,但有时候不会。
如果你足够自信,你可能要潜入FF或Chrome的源代码,看看他们在这种情况下做什么。
运行juniversalchardet时你是正确的我看到的页面实际上是CP1252,而不是在meta标签中设置的ISO-8859-1。当使用CP1252解码InputStream作为字符集时,撇号显示正确。 – mikesalvia
处理文字很烂。祝你好运! – cdeszaq
从一个非常快速的浏览(仅在浏览器中,而不是在十六进制编辑器中),该字符看起来像一个有效的ISO-8559-1字符。你为什么认为这里有两种编码?你的解析器不可能简单地吞下角色吗? –
感谢cdeszaq我一直在这个爬虫约6个月,并分析是引起了我的问题动辄但我有点知道这是因为“在最野” HTML可以从网站完全不同的只是一部分现场。 – mikesalvia