2012-12-04 25 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