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

Ruby Nokogiri在不同的系统上输出不同的字符串,ruby,nokogiri,Ruby,Nokogiri,我正在使用以下行读取本地.html文件: myDoc=File.open(“Ina.html”){| f | Nokogiri::html(f)} 我使用xpath获得一个节点,然后简单地打印它 divNode=myDoc.at_xpath(“//div[@id=“mw content text”]/p[1]”) 放置divNode 一个系统上的输出片段:使用ruby 2.3 Ina:ñe'pehê,ñe'ẽ蒂瓦·里尔(阿哈伊娜) 另一个系统上的输出片段:使用ruby 2.1 <p>

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

myDoc=File.open(“Ina.html”){| f | Nokogiri::html(f)}

  • 我使用xpath获得一个节点,然后简单地打印它

    divNode=myDoc.at_xpath(“//div[@id=“mw content text”]/p[1]”)
    放置divNode

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

    Ina:ñe'pehê,ñe'ẽ蒂瓦·里尔(阿哈伊娜)

    另一个系统上的输出片段:使用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>
    
    Ina:Ñe’&阿蒂尔德ª;佩赫和阿提尔德ª&阿蒂尔德±;e’&aa可爱º&分形12;tÃ&复制弗吉尼亚州(ahaÂ;&ACURC;aÃ;­;na)


    关于编码的进展有什么想法吗?所有关于强制编码和/或指定编码的建议都没有成功

    nokogiri有时会做一些奇怪的事情。我无法解释nokogiri在这里“应该”做什么——这两个版本在HTML文档中表示相同内容时都是“正确的”。这和nokogiri的版本完全一样吗?如果是这样的话,它可能是另一个版本的libxml,nokogiri在幕后使用它,并且在某些情况下将使用现有的系统安装。或者ruby 2.1和2.3之间的差异可能很重要,尽管这似乎不太可能

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

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

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

    等等,现在仔细看,我想第二个可能并不代表相同的东西,它是html字符实体,但我不确定它们是否真的是正确的。编码可能会搞砸吗?根据您在和操作系统中读取数据的方式,以及如果是unix机器,LANG env变量设置为什么,可能会弄乱编码


    另外,您是否确定要打开的
    Ina.html
    文件在两个系统上确实完全相同?它可能在下载过程中被损坏或进行了不同的转换吗?将文件从一台机器复制到另一台机器,以确保两个文件完全相同

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

    因此,解决方案是简单地读取整个.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)}

    作为参考,这里是我正在使用的html的url[link]()可能这是语言问题,一个系统可能支持另一个系统不支持。嗯。可能是这样,但当我直接打印实际字符串时,如put“”,就没有问题了。我想这也可能与Nokogiiri如何解码html文件有关。每个系统上有什么版本的Nokogiri?您是否尝试将uri解析为可读的格式?(
    URI.parse
    )请阅读“”。我们需要一个最小的输入HTML示例来演示这个问题。有问题的系统是什么操作系统和语言环境设置?Nokogiri很少做“奇怪的事情”。它做我们让它做的事情,所以当我们让它做奇怪的事情时,我们会得到奇怪的输出。