Nokogiri在不同的系统上输出不同的字符串

时间:2016-06-02 05:51:51

标签: ruby nokogiri

  • 我正在使用以下行读取本地.html文件:

    myDoc = File.open("Ina.html") { |f| Nokogiri::HTML(f) }

  • 我使用xpath获取节点,然后我只是打印它

    divNode = myDoc.at_xpath('//div[@id="mw-content-text"]/p[1]') puts divNode

一个系统上的输出片段:使用ruby 2.3

<p><b>Ina:</b> Ñe’êpehê , ñe’ẽtéva rire (aha´aína)</p>

另一个系统的输出片段:使用ruby 2.1

<p><b>Ina:</b> &Atilde;&#145;e&acirc;&#128;&#153;&Atilde;&ordf;peh&Atilde;&ordf; , &Atilde;&plusmn;e&acirc;&#128;&#153;&aacute;&ordm;&frac12;t&Atilde;&copy;va rire (aha&Acirc;&acute;a&Atilde;&shy;na)</p>

关于编码发生了什么的任何想法?强制编码和/或指定编码的所有建议都未成功。

2 个答案:

答案 0 :(得分:0)

nokogiri有时会做奇怪的事情。我无法解释nokogiri在这里“应该”做什么 - 两个版本在HTML文档中表示相同的东西都是'正确的'。这是nokogiri完全相同的版本吗?如果是这样,它可能是libxml的不同版本,nokogiri在引擎盖下使用,在某些情况下将使用现有的系统安装。或者红宝石2.1对2.3的差异可能很重要,尽管这似乎不太可能。

基本上,如果你想要完全相同的行为,你需要使用完全相同的版本 - ruby​​,nokogiri,libxml。

第一个是直接的unicode字节,第二个是由html字符实体替换的非ascii字符。两者都应该在浏览器中呈现相同。如果你想要其中一种行为而不是另一种行为(我个人认为我宁愿使用unicode),这是一个不同的问题,但是可能是一种迫使nokogiri这样做的方法。但我不知道。

如果您使用Nokogiri :: XML而不是Nokogiri :: HTML,我打赌它不会用html字符实体替换非ascii,但是如果我记得正确的话,你也不会得到一些“原谅”不完全合法的语法“HTML解析器使用的行为。

等等,现在看得更近,我想也许第二个不代表同一个东西,它是html字符实体,但我不确定它们是否真的是正确的。编码是否搞砸了?根据您读取数据的方式,操作系统以及LANG env变量设置为unix机器的内容,可能会破坏编码。

另外,您是否肯定您正在打开的Ina.html文件在两个系统上真的完全相同?它可能在下载过程中被破坏或转换不同吗?将文件从一台计算机复制到另一台计算机,以确保这两个文件完全相同。

答案 1 :(得分:0)

好吧,我解决了这个问题,但我仍然不完全理解为什么这种方法不起作用。

因此,解决方案是简单地读取整个.html文件,然后通过解析文件的字符串来实例化nokogiri对象。

  file = File.open(outputFolder + "/" + htmlName,"rb")
  content = file.read
  doc = Nokogiri::HTML.parse(content,nil, "UTF-8")

对我来说,这相当于我试过的任何一个陈述:

  • myDoc = File.open("Ina.html") { |f| Nokogiri::HTML(f) }
  • myDoc = File.open("Ina.html", nil, "UTF-8") { |f| Nokogiri::HTML(f) }