如何将每个节点收集到以子节点作为对象的数组?

时间:2014-12-22 10:14:19

标签: ruby nokogiri

我想把每个行中的子对象作为数组。怎么做?

现在我可以获得.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"}]

我非常感谢您的帮助。

2 个答案:

答案 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"}]]