我正在使用以下行读取本地.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> Ñe’êpehê , ñe’ẽtéva rire (aha´aína)</p>
关于编码发生了什么的任何想法?强制编码和/或指定编码的所有建议都未成功。
答案 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) }