Opción 1: Coge todos los elementos de datos
Si todo lo que necesita es una lista de todos los elementos de datos de la página , He aquí una sola línea:
Hash[doc.xpath("//span/@*[starts-with(name(), 'data-')]").map{|e| [e.name,e.value]}]
Salida:
{"data-age"=>"50", "data-location"=>"London"}
Opción 2: Resultados del Grupo por etiqueta
Si desea agrupar los resultados por etiqueta (tal vez lo que necesita hacer adicional procesamiento en cada etiqueta), se puede hacer lo siguiente:
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
Entonces tags
es un AR rayos que contienen pares clave-valor hash, agrupados por etiqueta.
Opción 3: Comportamiento como el plugin de jQuery conjuntos de datos
Si prefiere el enfoque de plug-in similar, la siguiente información le dará un método dataset
en cada 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
entonces usted puede encontrar el conjunto de datos para un solo elemento:
doc.at_css("span").dataset
O obtener el conjunto de datos para un grupo de elementos:
doc.css("span").map(&:dataset)
Ejemplo:
El siguiente es el comportamiento del método dataset
encima. Dadas las siguientes líneas en el código 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>
la salida sería:
[
{"data-location"=>"London", "data-age"=>"50"},
{"data-location"=>"Oxford", "data-age"=>"40"}
]
El “duplicar” cuestión vinculada se atribuye sobre _creating_ de datos (y es Rieles específica), esta pregunta se refiere a _extracting_ ellas desde HTML existente, por lo que no es un duplicado. – matt