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

  • 本文关键字:对象 数组 节点 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"}]

我将非常感谢您的帮助。

我会这样做:

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

相关内容

  • 没有找到相关文章

最新更新