3

我对编程陌生,正在用 Ruby 1.9.3 编写一个小练习程序,该程序使用 Nokogiri 用邮政编码查询加拿大议会网站,然后将相应议员的姓名及其骑马打印到终端。

我的代码获取页面并很好地隔离了 MP 的名称/骑行,但在 shell 中将 UTF-8 字符显示为纯 ASCII。我希望改为显示 UTF-8 字符。

我知道 shell 可以处理 UTF-8,因为:

irb> riding = "St-Jérôme"
=> "St-Jérôme"
irb> puts riding
St-Jérôme
=> nil

我用来获取页面的代码:

page = Nokogiri::HTML(open("http://parl.gc.ca/ParlInfo/Compilations/HouseOfCommons/MemberByPostalCode.aspx?PostalCode=#{postalcode}"))

这是我键入时此代码返回的示例puts page

<span id="ctl00_cphContent_repMP_ctl00_grdConstituencyAddress_ctl02_Label12">St-J&Atilde;&copy;r&Atilde;&acute;me</span>

所以“ ”在页面输出中St-Jérôme变成“ St-J&Atilde;&copy;r&Atilde;&acute;me”,或者只是“ St-J&Atilde;&copy;r&Atilde;&acute;me”在终端中。

也许有一种方法可以在将其存储为字符串变量时对其进行转换?或者也许我可以在 Nokogiri 中设置一个选项,它将它作为 UTF-8 而不是 ASCII 拉下来?

我在 Google 和 Stack Overflow 上搜索了很长时间以找到答案,但没有找到任何相关或我理解的内容;再说一次,我对此很陌生。如果这是重复的,请指出我正确的方向。

非常感谢。

4

2 回答 2

7

尝试

page = Nokogiri::HTML(open("http://parl.gc.ca/ParlInfo/Compilations/HouseOfCommons/MemberByPostalCode.aspx?PostalCode=#{postalcode}"), nil, "UTF-8")

反而。这应该将页面解析为 UTF-8 并解决问题。

于 2013-07-23T05:48:58.653 回答
4

@BadgerPriest 有答案。原因如下:检查Nokogiri::HTML::Document.parse的来源。

Nokogiri 依赖 LibXML2 来处理解析,但 LibXML2 不能很好地确定被解析文档的正确字符编码。Nokogiri 平底船并默认为 ASCII-8 位,这会导致多字节字符被破坏。

通过强制编码为 UTF-8,Nokogiri 与页面的编码一致,并且能够正确返回和/或显示字符。

当涉及到与其中的实际有效负载匹配的编码时,HTML 页面是一个真正的混合包。看到与实际字符无关的编码是很常见的,因此我们经常不得不告诉 Nokogiri 将 HTML 解释为什么。它很丑陋,但它是互联网遗留 HTML“财富”的状态。

于 2013-07-23T06:05:09.253 回答