1

我目前正在抓取一些 RSS 提要并将项目收集到节点集中。这很好用,但是 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.

崩溃日志在这里..

4

1 回答 1

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>在寻找它们之前,我还会重新考虑删除所有节点的逻辑。

如果您解释您正在尝试做什么,并分享一个 XML 的小示例,也许我们可以为您提供更好的帮助。

于 2012-12-04T15:25:23.503 回答