如何将Nokogiri刮取的HTML作为UTF-8输出到终端?

如何将Nokogiri刮取的HTML作为UTF-8输出到终端?,html,ruby,encoding,utf-8,nokogiri,Html,Ruby,Encoding,Utf 8,Nokogiri,我对编程非常陌生,我正在用Ruby 1.9.3编写一个小的实践程序,它使用Nokogiri用邮政编码查询加拿大议会网站,然后打印相应议会议员的姓名以及他们乘车前往终点站的信息 我的代码获取页面并很好地隔离MP的名称/名称,但在shell中以普通ASCII格式显示UTF-8字符。我希望显示UTF-8字符 我知道shell可以处理UTF-8,因为: irb> riding = "St-Jérôme" => "St-Jérôme" irb> puts riding St-Jérôme

我对编程非常陌生,我正在用Ruby 1.9.3编写一个小的实践程序,它使用Nokogiri用邮政编码查询加拿大议会网站,然后打印相应议会议员的姓名以及他们乘车前往终点站的信息

我的代码获取页面并很好地隔离MP的名称/名称,但在shell中以普通ASCII格式显示UTF-8字符。我希望显示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}"))
这是我键入
放置页面时此代码返回的示例:

<span id="ctl00_cphContent_repMP_ctl00_grdConstituencyAddress_ctl02_Label12">St-J&Atilde;&copy;r&Atilde;&acute;me</span>
St-JÃ&复制rÃ&严重的我
因此,
St-Jérôme
在页面输出中变为“
St-JÃ;©;rÃ;´;me
”,或者在终端中变为“
St-JÃ;©;rÃ;´;me

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

我在Google和Stack Overflow上搜索了很长时间才找到答案,但没有找到任何相关或我理解的东西;再说一次,我在这方面还是个新手。如果这是重复的,请给我指出正确的方向

非常感谢。

试试看

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

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

@BadgerPriest有答案。原因如下:请检查源代码以查找

Nokogiri依赖LibXML2来处理解析,但LibXML2在确定被解析文档的正确字符编码方面做得不好。Nokogiri punt并默认为ASCII-8bit,这会导致多字节字符被损坏

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


当涉及到编码与HTML页面中的实际负载匹配时,HTML页面是一个真正的混合包。很常见的情况是,编码与实际字符没有任何关系,因此我们经常不得不告诉Nokogiri如何解释HTML。这很难看,但这是互联网遗留HTML的“财富”状态。

我们需要更多/更好的信息。您使用的邮政编码是什么?我们需要一个您正在使用的代码示例,不仅用于检索URL,还用于检索您想要的标记。谢谢你的解释。一位程序员朋友告诉我,我应该学习使用Nokogiri,我发现文档有点难以理解——我对HTML/CSS/XML也比较陌生,这对我没有帮助。感谢您花时间为我解释。是的,Nokogiri是一个很好的工具,一旦您熟悉了解析和查找,您就会想知道为什么有人会使用任何其他处理XML/HTML的方法。相比之下,通过正则表达式处理这两种情况几乎都是原始的。