2016-11-08 6 views
1

У меня есть этот HTML:Как перебрать вложенных элементов

<div class="date"> 
    <h3 class="date-title">Today</h3> 

    <div class="film"> 
    <img class="poster" src="film1" /> 
     <h4 class="title">Film 1</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>12:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 

    <div class="film"> 
    <img class="poster" src="film2" /> 
     <h4 class="title">Film 2</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>3:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 

    <div class="film"> 
    <img class="poster" src="film3" /> 
     <h4 class="title">Film 3</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>6:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 
</div><!-- /.date --> 

<div class="date"> 
    <h3 class="date-title">Tomorrow</h3> 

    <div class="film"> 
    <img class="poster" src="film1" /> 
     <h4 class="title">Film 1</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>2:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 

    <div class="film"> 
    <img class="poster" src="film2" /> 
     <h4 class="title">Film 2</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>5:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 

    <div class="film"> 
    <img class="poster" src="film3" /> 
     <h4 class="title">Film 3</h4> 
    <ul class="session-times"> 
     <li> 
     <a href="#"> 
      <time>8:00 PM</time> 
     </a> 
     </li> 
    </ul> 
    </div><!-- /.film --> 
</div><!-- /.date --> 

и я извлечение данных с помощью этого Ruby-код:

Это дает мне:

[ 
    { 
    "date": "Today" 
    }, 
    { 
    "date": "Tomorrow" 
    } 
] 

но я хотел бы зациклиться на трех фильмах n раз в каждой секции .film и включить их под каждую дату в o utput, поэтому она должна выглядеть следующим образом:

[ 
    { 
    "Today": { 
     "films": [ 
     { 
      "film": "Film1", 
      "time": "12:00 PM" 
     }, 
     { 
      "film": "Film2", 
      "time": "15:00 PM" 
     }, 
     { 
      "film": "Film3", 
      "time": "6:00 PM" 
     } 
     ] 
    }, 
    { 
    "Tomorrow": { 
     "films": [ 
     { 
      "film": "Film1", 
      "time": "14:00 PM" 
     }, 
     { 
      "film": "Film2", 
      "time": "5:00 PM" 
     }, 
     { 
      "film": "Film3", 
      "time": "8:00 PM" 
     } 
     ] 
    }, 

Я не могу понять, где строить свой массив в пределах вложенного цикла.

ответ

1

Идея здесь - найти узлы с классом date (массив узлов Nokogiri). И преобразуйте этот массив (с помощью метода map) в нужную вам структуру. Результатом будет массив (потому что map) хешей (потому что это то, что я возвращаю во внешнем map). Чтобы создать структуру, которую вы хотите в любом хеше, я использую те же понятия: найдите узлы nokogiri с помощью метода css и map каждый результат в том, что вы хотите.

date_nodes = nokogiri_object.css('.date') 
date_nodes.map do |date| 
    { 
    date.css('.date-title').text => { 
     "films" => date.css('.film').map do |film| 
     { 
      "film" => film.css('img.poster').attr('src').value, 
      "time" => film.css('time').text 
     } 
     end 
    } 
    } 
end 
=> [{"Today"=>{ 
    "films"=>[ 
    {"film"=>"film1", "time"=>"12:00 PM"}, 
    {"film"=>"film2", "time"=>"3:00 PM"}, 
    {"film"=>"film3", "time"=>"6:00 PM"}]}}, 
    {"Tomorrow"=>{ 
    "films"=>[ 
    {"film"=>"film1", "time"=>"2:00 PM"}, 
    {"film"=>"film2", "time"=>"5:00 PM"}, 
    {"film"=>"film3", "time"=>"8:00 PM"}]}} 
    ] 
+0

Отлично, спасибо! – matski

+2

Вместо того, чтобы метать код, также дайте объяснение тому, что делает код. Идея заключается в том, что мы обучаем, а не просто предоставляем решение. Разница заключается в том, чтобы дать кому-то рыбу или научить их ловить рыбу. –

+0

Я не думаю, что автор не может понять мой код. Я думаю, что обычно начинающему/не эксперту трудно думать, как решить проблему, но показать им решение не означает, что они не могут понять решение. – Ursus