我试图从website抓取一个跟踪列表。我的相关代码是:
page.css('ol').each do |line|
subarray = line.text.strip.split(" - ")
end
这使得数组将第一个艺术家带入第一个索引(如我所愿),但将轨道和第二个轨道的艺术家添加到第二个索引中,如下所示:
subarray[0] = Rick Wilhite
subarray[1] = Magic Water [Still Music]
Edward
subarray[2] = Into A Better Future [Giegling]
Kassem Mosse
subarray[3] = Zolarem [Mikrodisko Recordings]
After Hours
我包含了嵌套标记,因此我的代码为:
page.css('ol li').each do |line|
subarray = line.text.strip.split(" - ")
end
但这似乎只有subarray[0]
显示"Klara Lewis"
和subarray[1]
显示"Shine [Editions Mego]"
,这是跟踪列表中的最后一首曲目。所有其他索引值均为空白。
更复杂的是,我想从最终成为轨道值的记录标签中删除记录标签。我认为正确的正则表达式是\[[\d\D]*?\]
,但我认为这需要在数据进入数组之前应用,以避免迭代数组时出现复杂问题。我尝试将其作为第二个分隔符传递给分割(以及' - '
)并且不起作用,我还尝试通过将代码更改为:
page.css('ol').each do |line|
subarray = line.text.strip.split("\[[\d\D]*?\]")
end
但这似乎也行不通。任何人都可以帮我这个或给我正确的指针吗?
答案 0 :(得分:0)
这里发生了什么:
page.css('ol')
为每个<ol>
代码提供了整个<li>
:
<ol>
<li>Rick Wilhite...</li>
<li>Edward...</li>
...
<li>Klara Lewis...</li>
</ol>
当一个大块进入.each
循环时,你只能在循环中运行一次。因此,当您应用.split(" - ")
方法时,subarray
将被填充一次,所有文字都由-
分隔。
另一方面,page.css('ol li')
为您提供了每个人<li>
,如下所示:
<li>Rick Wilhite...</li>
<li>Edward...</li>
...
<li>Klara Lewis...</li>
这一次,您为循环播放了17次,每个<li>
标记一次。第一次,.split(" - ")
应用于文本并存储在subarray
变量中。问题是,下次循环时,subarray
会被第二个<li>
的分割文本覆盖。因此,在最后一次之后,subarray
变量的唯一内容是最终<li>
的分割文本:&#34; Klara Lewis&#34;和#34; Shine [Editions Mego]&#34;。
我认为您已经了解了如何从网站中删除,但我建议您逐步增加脚本,以便准确了解您在每个步骤中所做的事情。例如,使用puts
检查page.css('ol')
为您提供的内容以及它与page.css('ol li')
的区别。当它经历循环时会发生什么?您申请.split()
后会得到什么?建设更慢,探索周围,以确保你了解你正在做的事情将帮助你避免达到死胡同。希望有所帮助!