抓取HTML的Ruby字符编码问题

RTF

我在Ruby脚本中遇到字符编码问题,该脚本使用Nokogiri gem进行了一些HTML抓取和解析。在脚本的某一时刻,我调用join("\n")了从某些HTML中提取的字符串数组,这会导致此错误:

./script.rb:333:in `join': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)

在我的日志中,可以看到Café出现了一些包含在联接操作中的字符串。

是我数组中要连接的某些字符串是ASCII-8BIT,有些是UTF-8,而ruby无法将它们组合在一起吗?使用Nokogiri(转换为UTF-8)解析字符串后,是否需要转换或清理字符串?

在尝试对HTML内容进行任何其他操作之前,我尝试force_encoding('UTF-8')encode('UTF-8')对其进行了处理,但这无济于事。实际上,在尝试之后encode('UTF-8'),脚本调用to_s包含的字符串时甚至更早崩溃Café

字符编码总是让我感到困惑。我还有其他方法可以清理字符串以避免此错误吗?

编辑:
最近我在Perl中做过类似的事情,并使用了一个名为的模块,Text::Unidecode并且能够将我的字符串传递给一个函数,该函数可以转换任何有问题的字符,例如a,将尖锐字母转换为普通字母a红宝石有什么类似的东西吗?(尽管这不一定是我想要的目标,但是如果我可以使a保持敏锐,那我认为是可取的。

Edit2:
我对此感到非常困惑,事实证明很难可靠地复制它。这是一些代码:

[CODE REMOVED]

Edit3:
我删除了以前发布的代码示例,因为它不正确。但最重要的是,每当我尝试打印或调用to_s被抓取的字符串时,都会遇到编码错误。

Edit4:
最终发现,抓取的html输入不是引起问题的原因。每当我尝试在包含(尤其是)抓取的html文本的哈希值上打印或调用to_s时,都会遇到编码错误。“其他内容”是来自数据库查询的值,它们在中返回ASCII-8BIT为了解决这个问题,我明确地必须调用force_encoding('UTF-8')我使用的每个数据库值(尽管我听说mysql2gem会自动执行此操作,所以我应该切换到该值)。

我讨厌字符编码。

亩太短

大概Café应该是Café如果我们从CaféUTF-8开始,但是将字节当作是在ISO-8859-1(AKA Latin-1)中进行编码,然后将它们重新编码为UTF-8,我们将得到Café您所看到的。例如:

> s = 'Café'
 => "Café" 
> s.encoding
 => #<Encoding:UTF-8> 
> s.force_encoding('iso-8859-1').encode('utf-8')
 => "Café" 

因此,在某处您正在读取UTF-8字符串,但将其视为Latin-1并将其重新编码为UTF-8。我猜想Nokogiri正在阅读该页面并认为它是Latin-1,或者被您的用户代理告知它正在获取Latin-1文本。也许您的某个地方的默认编码不正确,或者HTTP标头与编码有关,或者页面本身与编码有关。

您需要将所有内容放入刮板边缘的UTF-8中。找出谁在撒谎,然后在那儿整理出来。

别难过,抓取和编码是混乱,愚蠢、,测和烈酒的噩梦。服务器的谎言,页面的谎言,浏览器的谎言,没有人感到高兴。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章