我想把每个行中的子对象作为数组。怎么做?
现在我可以获得.row
子课程列表:
require "nokogiri"
html = <<-EOS
<div id="layout-grid">
<div class="row">
<div class="col-md-12">.col-md-12</div>
</div>
<div class="row">
<div class="col-md-6">.col-md-6</div>
<div class="col-md-6">.col-md-6</div>
</div>
</div>
EOS
def jsonize_grid(element)
rows = []
rows << element.css('.row > div').map {|node| { col: node.attr('class') } }
rows
end
doc = Nokogiri::HTML.parse(html).css("#layout-grid")
puts jsonize_grid(doc)
我想要的结果:
[{col: "col-md-12"}],[{col: "col-md-6"},{col: "col-md-6"}]
我非常感谢您的帮助。
答案 0 :(得分:2)
我这样做:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<div id="layout-grid">
<div class="row">
<div class="col-md-12">.col-md-12</div>
</div>
<div class="row">
<div class="col-md-6">.col-md-6</div>
<div class="col-md-6">.col-md-6</div>
</div>
</div>
EOT
以下是如何找到&#34; layout-grid&#34;阻止,然后嵌入&#34; .row&#34;的div:
content = doc.search('#layout-grid .row').map{ |row|
row.search('div').map{ |div|
{'col' => div['class']}
}
}
content
# => [[{"col"=>"col-md-12"}], [{"col"=>"col-md-6"}, {"col"=>"col-md-6"}]]
'#layout-grid .row'
是CSS选择器,它告诉libXML2库在查找嵌入的div时执行大部分繁重工作,如果您正在处理大型HTML文件,则转换为速度。
可以使用[...]
轻松访问标记的参数,无论它们是否在XML或HTML文件中,就像节点是哈希一样。这样可以减少使用div['class']
的冗长和可读性。
content
可以使用以下方式转换为JSON:
require 'json'
puts content.to_json
# >> [[{"col":"col-md-12"}],[{"col":"col-md-6"},{"col":"col-md-6"}]]
答案 1 :(得分:1)
您需要映射两次才能获得数组数组。
这应该返回你想要的东西:
def jsonize_grid(element)
element.css('.row').map{|row| row.css('div').map{|div| {col: div.attr('class')}} }
end
# [[{:col=>"col-md-12"}], [{:col=>"col-md-6"}, {:col=>"col-md-6"}]]