1

因此,我正在尝试使用 nokogiri从某个网站上进行一些屏幕抓取,但网站所有者未能在<meta>标签中指定页面的正确编码。这样做的结果是我正在尝试处理认为它们是 utf-8 但实际上不是的字符串。

(如果你在乎,这里是我用来测试的文件:

)

在进行了大量搜索之后(这个 SO question特别有用),我发现调用encode('iso-8859-1', 'utf-8')该测试字符串“有效”,因为我得到了一个正确的 © 符号。现在的问题是,我想要的其他一些字符串中还有其他字符在转换为拉丁编码时确实不起作用(Shōta例如,变成Sh�\x8Dta)。

现在,我可能会打扰相应的网站管理员并尝试让他们修复他们该死的编码,但与此同时,我希望能够使用我拥有的字节。我相当肯定有一种方法,但我无法终生弄清楚它是什么。

4

2 回答 2

1

因此,问题在于 ANN 仅通过标头指定编码,而 Nokogiri 不接收来自 open() 函数的标头。因此,Nokogiri 猜测该页面是拉丁编码的,并生成了我们确实无法反转的字符串以从中取回原始字符。

您可以将 Nokogiri 的编码指定为 Nokogiri::HTML() 的第三个参数,这解决了我最初试图解决的问题。所以,我会接受这个答案,即使我问的更具体的问题(如何从拉丁字符串中取出那些非拉丁字符)是无法回答的。

于 2010-03-03T22:17:30.750 回答
1

这些页面似乎被正确编码为 UTF-8。这就是我的浏览器看到它们的方式,当我查看它们并告诉编辑器将它们解码为 UTF-8 时,它们看起来很好。我看到的唯一问题是,某些版权符号在添加到内容之前(或之后)似乎已经损坏。o-macron 和其他非 ASCII 字母通过就好了。

我不知道您是否知道这一点,但是通知客户端页面编码的正确方法是通过标题。页面可能会在标签中包含该信息<meta>,但这既不是必需的,也不是预期的;如果标头存在,浏览器通常会忽略此类标记。

由于您的页面是 XHTML,它们还可以将编码信息嵌入到 XML 处理指令中,但同样,它们不是必需的。但这也意味着您可以让 Nokogiri 将它们视为 XML 而不是 HTML,在这种情况下,我希望它默认使用 UTF-8。但是我对Nokogiri不熟悉,所以我不能确定。无论如何,标题仍然是最终权限。

于 2010-03-01T01:41:04.730 回答