2012-12-04 31 views
1

我目前正在抓取一些RSS源並將項目收集到一個節點集中。這很好,但是Nokogiri與一些項目崩潰。起初我認爲我的OSX開發環境出了問題,所以安裝了Debian服務器,並得到了完全相同的錯誤。還嘗試將Ruby從1.9.3降級到1.9.2。Nokogiri:node_set.rb:239:[BUG]分割錯誤

有什麼建議嗎?

某些代碼:

doc.xpath("//item").remove 
nodeset = doc.xpath("//item") 
.. 
api_doc.xpath("//item").each do |node| 
    node = check_score(node) 
    unless node.nil? 
    nodeset << node 
    end 
end 

def check_score(node) 
    if node.xpath('website:attr[@name="imdbscore"]/@value').text.to_i > 6 
    return node 
    end 
end 

# sorting and finally add nodeset to doc. 

Crash log here..

+0

'#check_score'做了什麼?如果分數通過過濾器,則 – krichard

+0

返回節點。返回節點如果node.xpath('網站:attr [@ name =「imdbscore」]/@值')。text.to_f> 6嘗試沒有check_score方法 - 同樣的問題。 – atmorell

+0

如果我們看到一些演示問題的示例XML,它會有所幫助。另外,請不要鏈接到崩潰日誌,總結您問題中的重要信息,以便我們能夠快速引用它,而不是讓我們追趕它來幫助您。最後,您使用的是什麼版本的Nokogiri,再加上LibXML2的哪個版本? –

回答

1

我認爲這是不好的做法,刪除所有//item節點,然後嘗試找到他們。在那裏,我可以看到麻煩醞釀。

這將刪除該文檔的所有<item>節點:

doc.xpath("//item").remove 

這試圖找到所有<item>節點,它會返回一個空的節點集:

nodeset = doc.xpath("//item") 

你沒有表現,其中api_doc來從,但如果它是來自doc的節點,尤其是在刪除節點之前,其狀態是可疑的,因爲您可能有一些懸掛引用來刪除<item>節點。由於是,這種試圖遍歷所有<item>節點,這可能不存在,因此空節點集可以返回,或者更糟,可能會損壞:

api_doc.xpath("//item").each do |node| 
    node = check_score(node) 
    unless node.nil? 
    nodeset << node 
    end 
end 

我檢查修訂爲您引入nokogiri和libxml2的並確保它們是最新的。如果沒有,更新它們。在查找它們之前,我還會重新考慮刪除所有<item>節點的邏輯。

也許我們可以幫助你更好地解釋你想要做的事情,並分享一個XML的小例子。

+0

問題是我將節點添加回nodeset的方式:nodeset << node ...使用這個:doc.root.add_child(node)來代替。謝謝! – atmorell