2014-12-22 2 views
1

Я хотел бы забрать детей как объекты в каждой строке в виде массива. Как это сделать?Как собрать каждый узел в массив с дочерними объектами?

На данный момент я могу получить список .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

В чем проблема? код работает! – marquez

+0

На данный момент у меня есть «плоский» список столбцов, который я хотел бы нажать в строке правого ряда. – luzny

+0

Ваш желаемый результат не является допустимым объектом Ruby или JSON. –

ответ

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

Вот как найти блок «макета сетки», то встроенный " .row»дивы:

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 сделать большую часть АЭМ vy работать при поиске встроенных 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"}]] 
Смежные вопросы