2013-08-27 94 views
2

我有一個XML飼料使用引入nokogiri被拉動和已工作的罰款。添加了一個新的Feed,我需要插入並且不會一次加載所有內容。如果我在瀏覽器中訪問xml源,我可以看到一組初始的數據加載,然後不久之後加載更多的數據。當我使用Nokogiri時,它只獲取最初的一組數據。我也嘗試使用curl來捕獲feed,並得到相同的結果。捕捉內容,不加載立即

我怎樣才能得到所有的數據從XML源?有沒有我可以傳遞給Nokogiri的選項或者我可以設置爲捲曲的標誌?我查看了Nokogiri文檔和curl手冊頁,但無法弄清楚。

當我拉數據下來(與引入nokogiri或捲曲),它看起來像這樣(有很多超過2項雖然):

<?xml version="1.0" encoding="UTF-8"?> 
<item-syndication version="5"> 
    <item id="1"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
    <item id="2"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
</item-syndication> 

如果我訪問的URL在瀏覽器中,它最初看起來像以上,但然後加載更多的項目,如下面(它最終有很多超過4項):

<?xml version="1.0" encoding="UTF-8"?> 
<item-syndication version="5"> 
    <item id="1"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
    <item id="2"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
    <item id="3"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
    <item id="4"> 
    <more-data >lorem ipsum</more-data> 
    </item> 
</item-syndication> 

以下是初始請求的請求和響應頭: Request and Response Headers for initial request

下面是該圖標的請求和響應頭,如果這是有幫助的: Request and Response Headers for favicon

+0

能否請您添加HTTP請求和響應頭?我認爲這可能有助於準確理解這兩種服務之間正在發生的通信。 –

+0

我添加了屏幕截圖。那是你在找什麼? –

+0

您是否還可以抓取XHR,以查看加載XML流中的數據時發生的任何POST請求?我將能夠更好地用這些信息完成我的答案。 (Firebug可以爲你做這個,並且是我個人對Web Dev Tools的偏好) –

回答

1

所以,正確回答這個問題時,我用錯了網址。通過使用正確的URL,我能夠在Nokogiri和curl中獲得預期的結果。

1

這是非常有可能的是,頁面使用AJAX加載XML。 (如果您可以使用Firebug抓取XHR來準確查看它們用來附加新XML的POST請求,它可能會給您/我們一個更好的主意)

說起來有點難過,但是Nokogiri以及機械化(另一個XML解析/刮建在引入nokogiri工具)不支持Javascript以任何方式,因此將無法獲得即通過AJAX推到了頁面數據,而無需重新加載頁面(可能會或可能不會是一個爲您選擇)。

但你必須加載頁面每5秒一個選擇項環說30秒,XML比較原始的刮,這樣你就不會得到重複。你怎麼做完全取決於你,但是將值存儲在一個REXML中,並與一個新刮取的值比較似乎並不是最糟糕的選擇。

另一種方法是使用瀏覽器模擬器,完全支持JavaScript。 Watir和Selenium是我知道的兩個,它允許你阻止重新加載頁面來接受傳入的更改(雖然我個人沒有使用過,因爲我使用Mechanize的大部分工作都能夠解決Javascript問題通過重新獲取頁面或手動發送GET/POST)。使用這兩個寶石的缺點是仿真整個瀏覽器時體積龐大。

的Watir - http://rubygems.org/gems/watir

硒 - http://rubygems.org/gems/selenium-webdriver