2012-03-17 6 views
5

可能な重複属性:
Best way to use html5 data attributes with rails content_tag helper?は、HTML5のデータを抽出すると、タグから

を私はちょうどthis jQuery pluginのように、タグからすべてのHTML5のデータ属性を抽出したいです。例えば

、与えられた:

<span data-age="50" data-location="London" class="highlight">Joe Bloggs</span> 

を私のようなハッシュ取得したい:私はもともと、例えば、私のCSSセレクタの一部としてワイルドカードを使用して期待していた

{ 'data-age' => '50', 'data-location' => 'London' } 

Nokogiri(html).css('span[@data-*]').size 

ただし、サポートされていないようです。

+0

リンク質問が_creating_データ属性についてです(とRails固有のものです)「複製」、この質問はおよそそれらを_extracting_されます既存のHTMLからは重複していないので重複していません。 – matt

答えて

6

オプション1:グラブすべてのデータ要素

をあなたが必要とするすべては、すべてのページのデータ要素を一覧表示する場合

Hash[doc.xpath("//span/@*[starts-with(name(), 'data-')]").map{|e| [e.name,e.value]}] 

出力:

{"data-age"=>"50", "data-location"=>"London"} 

オプション2:あなたは、あなたの結果はタグでグループ化したい場合は、タグ

により、当社グループの業績は、(おそらく、あなたが追加行う必要があり、ここでワンライナーです各タグの処理)では、次の操作を実行できます。はarです。タグでグループ化されたキー値のハッシュペアを含むX線。

オプション3:あなたは、プラグインのようなアプローチを好む場合はjQueryのデータセットのプラグインのような挙動

、以下はあなたにすべての鋸山ノード上datasetメソッドを提供します。

module Nokogiri 
    module XML 
    class Node 
     def dataset 
     Hash[self.xpath("@*[starts-with(name(), 'data-')]").map{|a| [a.name,a.value]}] 
     end 
    end 
    end 
end 

その後、あなたは、単一の要素のためのデータセットを見つけることができます。

doc.at_css("span").dataset 

または要素のグループのためのデータセットを取得:

doc.css("span").map(&:dataset) 

例:

を以下は、datasetメソッドの動作です上記。 HTMLに以下の行を考える:

<span data-age="50" data-location="London" class="highlight">Joe Bloggs</span> 
<span data-age="40" data-location="Oxford" class="highlight">Jim Foggs</span> 

出力は次のようになります。

[ 
{"data-location"=>"London", "data-age"=>"50"}, 
{"data-location"=>"Oxford", "data-age"=>"40"} 
] 
+0

複数のスパンがある場合は、一緒にマッシュします。 – pguardiario

+0

@pguardiarioはい。これにより、ページ全体からのすべてのデータ属性を持つ単一のハッシュが作成されます。 –

1

element.attributesをループしてみて、data-で始まらないアトリビュートは無視してください。

2

Node#cssドキュメントには、カスタム擬似セレクタを接続する方法が記載されています。これは、「データ - 」で始まる属性を持つノードを選択するために、次のようになります。

Nokogiri(html).css('span:regex_attrs("^data-.*")', Class.new { 
    def regex_attrs node_set, regex 
    node_set.find_all { |node| node.attributes.keys.any? {|k| k =~ /#{regex}/ } } 
    end 
}.new) 
3

あなたは、XPathのビットでこれを行うことができます。

doc = Nokogiri.HTML(html) 
data_attrs = doc.xpath "//span/@*[starts-with(name(), 'data-')]" 

これはspan要素のすべての属性を取得します'data-'で始まる。 (これを2つのステップで行い、最初に関心のあるすべての要素を取得し、次にそれぞれのデータ属性を抽出することができます。

例を続行すると、

hash = data_attrs.each_with_object({}) do |n, hsh| 
    hsh[n.name] = n.value 
end 

puts hash 

生成:

{"data-age"=>"50", "data-location"=>"London"} 
関連する問題