Opzione 1: afferrare tutti gli elementi di dati
Se tutto ciò che serve è quello di elencare tutti gli elementi di dati della pagina , Ecco una battuta:
Hash[doc.xpath("//span/@*[starts-with(name(), 'data-')]").map{|e| [e.name,e.value]}]
uscita:
{"data-age"=>"50", "data-location"=>"London"}
Opzione 2: Risultati del Gruppo per tag
Se si desidera raggruppare i risultati per tag (forse avete bisogno di fare ulteriore elaborazione su ogni tag), è possibile effettuare le seguenti operazioni:
tags = []
datasets = "@*[starts-with(name(), 'data-')]"
#If you want any element, replace "span" with "*"
doc.xpath("//span[#{datasets}]").each do |tag|
tags << Hash[tag.xpath(datasets).map{|a| [a.name,a.value]}]
end
Poi tags
è un ar raggio contenente coppie di hash di valori-chiave, raggruppate per tag.
Opzione 3: Comportamento come il set di dati jQuery plugin di
Se preferite l'approccio plug-like, di seguito vi darà un metodo dataset
su ogni nodo Nokogiri.
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
Quindi è possibile trovare il set di dati per un unico elemento:
doc.at_css("span").dataset
O ottenere il set di dati per un gruppo di elementi:
doc.css("span").map(&:dataset)
Esempio:
Quanto segue è il comportamento del metodo dataset
sopra. Date le seguenti righe nel codice 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>
l'output sarà:
[
{"data-location"=>"London", "data-age"=>"50"},
{"data-location"=>"Oxford", "data-age"=>"40"}
]
Il “duplicato” questione collegata è attributi su _creating_ dati (ed è Rails specifico), questa domanda è su di loro _extracting_ da HTML esistente, quindi non è un duplicato. – matt