Nokogiri:node_set.rb:239:[BUG]分段错误

时间:2012-12-04 12:50:07

标签: ruby-on-rails ruby nokogiri

我目前正在抓取一些RSS Feed并将项目收集到节点集中。这很好用,但Nokogiri与一些物品崩溃。起初我认为我的OSX开发环境出了问题,所以安装了Debian服务器并得到了完全相同的错误。还尝试将Ruby从1.9.3降级到1.9.2。

有什么建议吗?

部分代码:

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..

1 个答案:

答案 0 :(得分:1)

我认为删除所有//item节点然后尝试找到它们是不好的做法。就在那里,我可以看到酿造麻烦。

这会从文档中删除所有<item>个节点:

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

这会尝试查找所有<item>个节点,这些节点将返回一个空的NodeSet:

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

您没有显示api_doc来自哪里,但如果它是来自doc的节点,特别是在删除节点之前,其状态是可疑的,因为您可能有一些悬空参考删除<item>个节点。这样做会尝试遍历可能不存在的所有<item>个节点,因此可能会返回一个空的NodeSet,或者更糟糕的是,可能会损坏:

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

我会检查你的Nokogiri和LibXML2的修订版,并确保它们是最新的。如果没有,请更新它们。我还会重新考虑在查找之前删除所有<item>节点的逻辑。

如果你解释了你想要做的事情,也许我们可以帮助你更好,并分享了一个小例子。