我想在每一行中选取子对象作为数组。怎么做?
现在,我可以获取.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"}]
我将非常感谢您的帮助。
我会这样做:
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
以下是查找"布局网格"块的方法,然后是嵌入式".row"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"}]]
你需要映射两次才能得到一个数组数组。
这应该返回您想要的内容:
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"}]]