如何迭代嵌套项

时间:2016-11-08 17:57:53

标签: arrays json ruby loops nokogiri

我有这个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代码提取数据:

nokogiri_object.css('.date').each do |d|
  date = d.css('.date-title').text
  dates.push(date: date)
  d.css('.film').each do |film|
    title = film.css('.title')
    title_en = title.text.strip
    time = film.css('.session-times/li/a/time').text
  end
end

这给了我:

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

但是我希望在每个n部分循环播放三部电影.film次,并将它们包含在输出中的每个日期下,所以看起来应该更像这样:

[
  {
    "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 个答案:

答案 0 :(得分:1)

这里的想法是首先找到类date(Nokogiri节点数组)的节点。并在您想要的结构中转换此数组(使用map方法)。结果将是一个数组(因为map)哈希(因为我在外部map返回)。要在任何哈希中创建所需的结构,我使用相同的概念:使用css方法查找nokogiri节点,并使用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"}]}}
  ]