2017-02-27 5 views
0

を使用して属性:私は上記のボディに、dd:meta2属性を持っています、すべてのdiv要素を取得したい私は体がのように見えるとHTMLを持って鋸山

<body> 
    <div class="myclass" dd:meta1="meta data 1" dd:meta2="CD5503253E54"></div> 
    <div class="myclass" dd:meta1="meta data 11"></div> 
</body> 

、I 1つのdivを取得します。

div要素を取得するコードを記述しましたが、属性には:というようなエラーが表示されています。

マイロジック:

page = Nokogiri::HTML(html_string) 
meta_data_divs = page.css('body').css("div[dd:meta2]") 

エラー:

unexpected ':' after '#<Nokogiri::CSS::Node:0x007fac6b986d58>' 

がどのように扱うか ':' 属性で?

答えて

0

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に走ったことを書いた後。それであなたはそれを持っています。

0

私は実際にこれをちょうど昨日やった。ここに私のhtmlた:

<div data-purpose="video-length">[^>]+<\/div> 

はここに私の鋸山表現だった:私はdivタグの内側から出たかった値を取り、余分なリターンを剥がし
page.parser.css("div[data-purpose=video-length]").first.try(:text).try(:strip) 

。 .try呼び出しを使用する理由は、nilが返されたときにifステートメントを処理する必要がないためです。ここでの秘密は、.css式の中で[]を使うことです。div [data-purpose = video-length]。

関連する問題