Nokogiriは名前空間パラメータの処理方法を知らないようです。
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<body>
<div class="myclass" dd:meta1="meta data 1" dd:meta2="CD5503253E54"></div>
<div class="myclass" dd:meta1="meta data 11"></div>
</body>
EOT
doc.search('div').select{ |div| div.attributes.include?('dd:meta2') }
# => [#(Element:0x3fea99895530 {
# name = "div",
# attributes = [
# #(Attr:0x3fea99895508 { name = "class", value = "myclass" }),
# #(Attr:0x3fea998954f4 { name = "dd:meta1", value = "meta data 1" }),
# #(Attr:0x3fea998954e0 { name = "dd:meta2", value = "CD5503253E54" })]
# })]
dd:meta2
パラメータですべてのdiv
のノードを返します。ここでは同じ結果を得るための別の方法です。
同様にあなたがat
ように行動するの端にタック.first
と同じを使用することができますが、それはの速さではないでしょう:これは、あなたがそれをしようとしていた方法よりも少し遅くなります
doc.search('div').find{ |div| div.attributes.include?('dd:meta2') }
# => #(Element:0x3fea99895530 {
# name = "div",
# attributes = [
# #(Attr:0x3fea99895508 { name = "class", value = "myclass" }),
# #(Attr:0x3fea998954f4 { name = "dd:meta1", value = "meta data 1" }),
# #(Attr:0x3fea998954e0 { name = "dd:meta2", value = "CD5503253E54" })]
# })
パーサがドキュメント全体を検索してすべてのdiv
タグを返すため、Rubyは結果を調べて、目的のパラメータを持つノードを見つける必要があります。しかし、例外を発生させるコードよりも無限に速くなります。
Nokogiriチームに問題を示すバグレポートを提出することをおすすめします。
ふむ、私はdd:meta2
の検索を行なったし、何が起こっているかを説明する鋸山の神からの答えを持っている、そしてそれは私が提案し、同じソリューションを持っているyour question on Nokogiri-Talkに走ったことを書いた後。それであなたはそれを持っています。