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 に答える