ruby-on-rails - Nokogiri 在服务器和本地主机上解析不同

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

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

首先,为了确保这不是 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

最佳答案

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

关于ruby-on-rails - Nokogiri 在服务器和本地主机上解析不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212691/

相关文章:

ruby-on-rails - Rails cron 不发送电子邮件

ruby-on-rails - 检查字符串是否为 base64

arrays - 如何在 ruby​​ 数组中仅添加正数?

ruby - 用 nil 填充堆栈并将 "top"解释为最后一个非 nil 值是否有一些优势?

ruby-on-rails - 使用 ruby​​ 2.1.0 和 rails 4.2.0 错误创建 Heroku 应用程序

ruby - 使用 Nokogiri 选择随机选择的 <br> 标签之间的所有 <span> 标签

ruby-on-rails - 无法使 postgres unaccent 扩展在 rails 上工作

ruby-on-rails - 在 MAC OS 10.9 Mavericks(测试版)上安装 RAILS

ruby - Mac 用户并收到警告 : Nokogiri was built against LibXML version 2. 7.8,但已动态加载 2.7.3

ruby - 使用 Mechanize 和 nokogiri 使用正确的 xpath 抓取页面