Lựa chọn 1: lấy tất cả các yếu tố dữ liệu
Nếu tất cả bạn cần là để liệt kê tất cả các yếu tố dữ liệu của trang , Đây là một lớp lót:
Hash[doc.xpath("//span/@*[starts-with(name(), 'data-')]").map{|e| [e.name,e.value]}]
Output:
{"data-age"=>"50", "data-location"=>"London"}
Phương án 2: Nhóm kết quả theo tag
Nếu bạn muốn nhóm kết quả của bạn bằng thẻ (có lẽ bạn cần phải làm thêm xử lý trên mỗi thẻ), bạn có thể làm như sau:
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
Sau đó tags
là một ar ray chứa các cặp băm khóa-giá trị, được nhóm theo thẻ.
Lựa chọn 3: Hành vi như bộ dữ liệu jQuery plugin
Nếu bạn muốn tiếp cận plugin như thế nào, sau đây sẽ cung cấp cho bạn một phương pháp dataset
trên mỗi nút 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
Sau đó, bạn có thể tìm thấy các tập dữ liệu cho một yếu tố duy nhất:
doc.at_css("span").dataset
Hoặc tải dữ liệu cho một nhóm các yếu tố:
doc.css("span").map(&:dataset)
Ví dụ:
Sau đây là hành vi của phương pháp dataset
ở trên. Căn cứ vào dòng sau trong 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>
Kết quả sẽ là:
[
{"data-location"=>"London", "data-age"=>"50"},
{"data-location"=>"Oxford", "data-age"=>"40"}
]
Các “sao chép” Câu hỏi liên quan là các thuộc tính về _creating_ dữ liệu (và là Rails cụ thể), câu hỏi này là về _extracting_ họ từ HTML hiện tại, do đó, nó không phải là một bản sao. – matt