Ruby on rails Nokogiri在服务器上解析与本地主机上解析不同

Ruby on rails Nokogiri在服务器上解析与本地主机上解析不同,ruby-on-rails,ruby,nokogiri,open-uri,Ruby On Rails,Ruby,Nokogiri,Open Uri,在本地运行Nokogiri和在服务器上运行Nokogiri时,我发现了一些奇怪的区别。在我的本地机器上,整个文档似乎都在解析并可用,但在服务器上,我似乎得到了doctype选项卡和一些随机注释标记 首先,为了确保OpenURI没有问题,我检查了它——结果不准确,但包含正确的标记 本地: ruby-1.8.7-p352 :005 > s = open('http://www.pennstateind.com/store/PK2WAY.html') => #<File:/var/f

在本地运行Nokogiri和在服务器上运行Nokogiri时,我发现了一些奇怪的区别。在我的本地机器上,整个文档似乎都在解析并可用,但在服务器上,我似乎得到了doctype选项卡和一些随机注释标记

首先,为了确保OpenURI没有问题,我检查了它——结果不准确,但包含正确的标记

本地:

ruby-1.8.7-p352 :005 > s = open('http://www.pennstateind.com/store/PK2WAY.html')
=> #<File:/var/folders/G8/G8bsAGBk1o82Eyks3ZmFtq-+3Y6/-Tmp-/open-uri20120626-5891-10y2ncr-0> 
ruby-1.8.7-p352 :006 > s.length
=> 88408 
但是,当我在服务器上运行此操作时,我得到以下结果:

ruby-1.8.7-p352 :003 > d = Nokogiri::HTML(open('http://www.pennstateind.com/store/PK2WAY.html'))
=> [ OUTPUT OMITTED FOR BREVITY - CAN SUPPLY ON REQUEST ] 
ruby-1.8.7-p352 :004 > d.to_s.length
=> 85212  
rb(main):006:0> d = Nokogiri::HTML(open('http://www.pennstateind.com/store/PK2WAY.html'))
=> #<Nokogiri::HTML::Document:0x36620e14b580 name="document" children=   [#<Nokogiri::XML::DTD:0x36620e14b1c0 name="html">, #<Nokogiri::XML::Comment:0x36620e14b170 " Open Graph Tags ">, #<Nokogiri::XML::Comment:0x36620e14a98c " Customer_Session_Verified: 0 ">]>
irb(main):007:0> d.to_s.length
=> 172
有没有办法弄清楚发生了什么和/或解决这个问题


更新-为了找出问题的实际位置,我从服务器和本地主机中提取了一个文件,然后在每个服务器上运行它们。下面的结果表明,问题肯定出在Nokogiri身上-问题是什么,我仍然困惑于

本地运行:

# FILE ORIGINALLY PULLED FROM SERVER

ruby-1.8.7-p352 :015 > server_file = File.open("/Users/jmcdonald/Desktop/files/SERVER.txt", "r")
=> #<File:/Users/jmcdonald/Desktop/files/SERVER.txt> 
ruby-1.8.7-p352 :016 > server_file.read.length
=> 93071 

ruby-1.8.7-p352 :022 > Nokogiri::HTML(server_file).to_s.length
=> 98793

# FILE ORIGINALLY PULLED FROM LOCALHOST

=> #<File:/Users/jmcdonald/Desktop/files/LOCAL.txt> 
ruby-1.8.7-p352 :018 > local_file.read.length
=> 89622

ruby-1.8.7-p352 :026 > Nokogiri::HTML(local_file).to_html.length
=> 94632
#最初从服务器中提取的文件
ruby-1.8.7-p352:015>server_file=file.open(“/Users/jmcdonald/Desktop/files/server.txt”,“r”)
=> # 
ruby-1.8.7-p352:016>server_file.read.length
=> 93071 
ruby-1.8.7-p352:022>Nokogiri::HTML(服务器文件)
=> 98793
#最初从本地主机提取的文件
=> # 
ruby-1.8.7-p352:018>local_file.read.length
=> 89622
ruby-1.8.7-p352:026>Nokogiri::HTML(本地文件).to_HTML.length
=> 94632
正在服务器上运行:

# FILE ORIGINALLY PULLED FROM SERVER

irb(main):001:0> sf = File.open('/home/charlest/public_html/files/nokogiri_issue/SERVER.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/SERVER.txt>
irb(main):002:0> sf.read.length
=> 93071

irb(main):004:0> Nokogiri::HTML(sf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG

# FILE ORIGINALLY PULLED FROM LOCALHOST

irb(main):008:0> lf = File.open('/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt>
irb(main):009:0> lf.read.length
=> 89622

irb(main):011:0> Nokogiri::HTML(lf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG
#最初从服务器中提取的文件
irb(main):001:0>sf=File.open('/home/charest/public_html/files/nokogiri_issue/SERVER.txt',r')
=> #
irb(主):002:0>sf.read.length
=> 93071
irb(主要):004:0>Nokogiri::HTML(sf).至美国长度

=>896#Nokogiri的一个附带版本也有一个bug(我相信它影响了1.5.1),在一些有限的情况下影响了解析。我建议确保你的宝石是最新的。(gem更新)

尝试使用
文件#读取
而不是
文件#打开
或确保正在运行
lf。在尝试解析w/Nokogiri之前,请倒带
。您看到的行为很可能是由于
lf
文件句柄位于文件末尾,这意味着Nokogiri正在解析一个空文档

> remote = File.open('./PK2WAY.html')
# => #<File:./PK2WAY.html>
> remote.read.length
# => 92978
> remote.read.length
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 108
> remote.rewind
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 93847
>remote=File.open('./PK2WAY.html')
# => #
>远程读取长度
# => 92978
>远程读取长度
# => 0
>Nokogiri::HTML(远程)。至_.length
# => 108
>遥控倒带
# => 0
>Nokogiri::HTML(远程)。至_.length
# => 93847

看起来您的服务器和本地环境正在使用不同版本的。已知旧版本有奇怪的解析错误,因此尽可能将服务器更新到最新版本(或至少更新到开发时使用的相同版本)应该给你安排一下。

你是否尝试过使用curl或类似的方法来查看你点击的URL是否只是在不同的情况下返回不同的内容?是的-我使用irb的open uri来确认我返回的数据在这两种情况下都是有效的。大小似乎有所不同,但这似乎是服务器上的空白被去除,而不是本地主机上的空白。当我比较它们时,实际的标记似乎是相同的。为了验证我的响应,我只是尝试从localhost上打开的uri复制响应,将其保存到服务器上的一个文件中,然后将其读入Nokogiri。然后我得到了预期的结果,这告诉我openuri确实返回了一些不同的东西,即使在我最初的分析中它看起来是相同的。现在沿着这条路走下去……我进行了更多的测试,发现来自openuri的文件是有效的,并且工作正常。文件之间的差异最终不是间距,而是每次访问页面时页面上发生变化的随机内容。有关更多信息,请参阅上面我的原始帖子的更新-问题肯定在于Nokogiri。每台主机上的libxml2版本是什么?Nokogiri本身不太可能是这种解析差异的原因。猜测您的服务器正在使用旧的libxml2版本。感谢您的回复-无论版本如何,我都没有运气。我试过这个测试,从1.5.0到1.5.5,所有的测试结果都是一样的。请看我在上面关于服务器与本地安装的评论-实际安装过程中肯定发生了一些事情,但我正在等待主机的回复。谢谢,这是一个有效的问题(因此可能会帮助其他人),但不是我的特殊情况下的问题。我简化了回复,以限制显示的文本量。我粘贴的示例并不是按照我执行的顺序-只是为了显示正在发生的事情。问题确实在于服务器上安装了旧版本的libxml2。将libxml2更新为2.8.0版,现在一切都很好。
# FILE ORIGINALLY PULLED FROM SERVER

irb(main):001:0> sf = File.open('/home/charlest/public_html/files/nokogiri_issue/SERVER.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/SERVER.txt>
irb(main):002:0> sf.read.length
=> 93071

irb(main):004:0> Nokogiri::HTML(sf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG

# FILE ORIGINALLY PULLED FROM LOCALHOST

irb(main):008:0> lf = File.open('/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt>
irb(main):009:0> lf.read.length
=> 89622

irb(main):011:0> Nokogiri::HTML(lf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG
> remote = File.open('./PK2WAY.html')
# => #<File:./PK2WAY.html>
> remote.read.length
# => 92978
> remote.read.length
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 108
> remote.rewind
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 93847