2016-11-08 272 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" 
    } 
] 

但我想循环播放各个.film部分中的n三部电影,并将它们包含在o输出,所以它应该看起来更像这样:

[ 
    { 
    "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中返回)。要在任何散列中创建所需的结构,我使用相同的概念:使用css方法和map找到所需的nokogiri节点。

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