2012-06-26 74 views
3

當我在本地運行Nokogiri與運行在我的服務器上時,我遇到了一些奇怪的差異。在我的本地機器上整個文檔似乎解析並可用,但在服務器上我似乎得到了文檔類型選項卡和一些隨機的評論標籤。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 

唯一明顯的區別寶石對於JS編譯器 - 所有其他寶石之間的確切版本本地和服務器:

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 
+0

你有沒有嘗試過使用curl或類似的東西,看看你打的URL是否只是在不同的情況下返回不同的東西? –

+0

是的 - 我使用irb的open-uri來確認我收到的數據在兩種情況下都是有效的。大小似乎是不同的,但似乎是在服務器上刪除了空白區域,而不是在本地主機上。當我比較它們時,實際標記似乎是相同的。 – finn0013

+0

驗證我的迴應我剛剛嘗試複製本地主機上open-uri的響應,將其保存到服務器上的文件中,然後將其讀入Nokogiri。然後我得到了預期的結果,這告訴我open-uri確實正在返回一些不同的東西,即使它在我的初始分析中看起來是一樣的。現在沿着這條路走下去...... – finn0013

回答

2

它看起來像你的服務器和本地環境中使用不同版本的libxml2。舊版本已知具有奇怪的解析錯誤,因此將服務器更新爲最新版本(或者至少與開發中使用的版本相同)應該可以解決您的問題。

+0

問題確實是在服務器上安裝了舊版本的libxml2。將libxml2更新至2.8.0版,現在一切正常。 – finn0013

2

有也是Nokogiri的一個運行版本的錯誤(我相信它影響了1.5.1),這在一些有限的情況下影響了解析。我會建議確保你的寶石更新。 (寶石更新)

+0

感謝您的回覆 - 我是不管版本如何,都沒有運氣。我已經用1.5.0到1.5.5的所有內容試過了這個測試,所有結果都一樣。儘管在服務器上和本地安裝上看到了我的評論,但實際安裝時肯定會發生,但我仍在等待從主機回聽什麼。 – finn0013

0

嘗試使用File#read而不是File#open或確保您正在運行lf.rewind,然後嘗試解析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 
+0

謝謝,這是一個有效的問題(這樣可以幫助其他人),但不是在我的具體情況下的問題。我簡化了迴應,以限制顯示的文字數量。我粘貼的示例不是按照我執行的順序 - 只是爲了顯示正在發生的事情。 – finn0013

相關問題