如何迭代嵌套项
How to iterate over nested items
我有这个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"
}
]
但我想在每个 .film
部分循环播放三部电影 n
次,并将它们包含在输出的每个日期下,因此它应该看起来更像这样:
[
{
"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"
}
]
},
我不知道在嵌套循环中的何处构建我的数组。
这里的想法是首先找到具有 class date
的节点(Nokogiri 节点数组)。并将此数组(使用 map
方法)转换为您想要的结构。结果将是一个散列数组(因为 map
)(因为我在外部 map
中 return)。要在任何哈希中创建您想要的结构,我使用相同的概念:使用 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"}]}}
]
我有这个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"
}
]
但我想在每个 .film
部分循环播放三部电影 n
次,并将它们包含在输出的每个日期下,因此它应该看起来更像这样:
[
{
"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"
}
]
},
我不知道在嵌套循环中的何处构建我的数组。
这里的想法是首先找到具有 class date
的节点(Nokogiri 节点数组)。并将此数组(使用 map
方法)转换为您想要的结构。结果将是一个散列数组(因为 map
)(因为我在外部 map
中 return)。要在任何哈希中创建您想要的结构,我使用相同的概念:使用 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"}]}}
]