【问题标题】:Nokogiri parsing different on server versus localhostNokogiri 在服务器与 localhost 上的解析不同
【发布时间】:2012-06-28 02:05:32
【问题描述】:

在本地运行 Nokogiri 与在我的服务器上运行它时,我发现了一些奇怪的差异。在我的本地机器上,整个文档似乎可以解析并可用,但在服务器上,我似乎得到了 doctype 选项卡和一些随机评论标签。

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

本地:

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 

服务器:

rb(main):008:0> s = open('http://www.pennstateind.com/store/PK2WAY.html')
=> #<File:/tmp/open-uri20120626-22167-1td2l72-0>
irb(main):009:0> s.length
=> 98184

当我在本地机器上运行它时,我得到了这个:

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

唯一明显的 gem 区别在于 JS 编译器 - 所有其他 gem 都是本地和服务器之间的确切版本:

Local => libv8 (3.3.10.4 x86-darwin-10)
Server => libv8 (3.3.10.4 x86_64-linux)

任何想法如何弄清楚发生了什么和/或解决这个问题?


更新 - 为了找出问题的真正出处,我从服务器和本地主机中提取了一个文件,然后在每个文件上运行它们。下面的结果表明问题肯定出在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

在服务器上运行:

# 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

【问题讨论】:

  • 您是否尝试过使用 curl 或类似的方法来查看您点击的 URL 是否只是在不同情况下返回不同的内容?
  • 是的 - 我使用了 irb 的 open-uri 来确认我返回的数据在这两种情况下都是有效的。大小似乎不同,但这似乎是在服务器上而不是在 localhost 上去除了空白的地方。当我比较它们时,实际的标记似乎是相同的。
  • 为了验证我的响应,我只是尝试从本地主机上的 open-uri 复制响应,将其保存到服务器上的文件中,然后将其读入 Nokogiri。然后我得到了预期的结果,它告诉我 open-uri 确实返回了一些不同的东西,即使在我最初的分析中它看起来是一样的。现在走这条路……
  • 我进行了更多测试,发现来自 open-uri 的文件有效且工作正常。文件之间的差异最终不是间距,而是每次访问时在页面上更改的随机内容。有关更多信息,请参阅我上面原始帖子的更新 - 问题肯定出在 Nokogiri 上。
  • 每台主机上的 libxml2 版本是什么? Nokogiri 本身极不可能成为这样的解析差异的原因。猜测您的服务器正在使用旧的 libxml2 版本。

标签: ruby-on-rails ruby nokogiri open-uri


【解决方案1】:

Nokogiri 的已发布版本也存在一个错误(我相信它影响了 1.5.1),它在某些有限的情况下影响了解析。我建议确保您的宝石已更新。 (宝石更新)

【讨论】:

  • 感谢您的回复 - 无论版本如何,我都没有运气。我用从 1.5.0 到 1.5.5 的所有版本都试过这个测试,结果都一样。请参阅上面关于服务器与本地安装的评论 - 实际安装肯定会发生一些事情,但我正在等待我的主机回复什么。
【解决方案2】:

尝试使用File#read 而不是File#open 或确保在尝试使用Nokogiri 解析之前运行lf.rewind。您看到的行为很可能是由于您的 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

【讨论】:

  • 谢谢,这样做是一个有效的问题(因此它可能对其他人有所帮助),但在我的特定情况下不是问题。我简化了响应以限制显示的文本数量。我粘贴的示例不是我执行的顺序 - 只是显示正在发生的事情的顺序。
【解决方案3】:

您的服务器和本地环境似乎正在使用不同版本的libxml2。众所周知,旧版本存在奇怪的解析错误,因此将您的服务器更新到您可能的最新版本(或至少更新到您用于开发的相同版本)应该可以解决您的问题。

【讨论】:

  • 问题确实在于服务器上安装了旧版本的 libxml2。将 libxml2 更新到 2.8.0 版,现在一切正常。
猜你喜欢
  • 2021-03-31
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多