刮痧轨道清单

时间:2015-03-19 11:06:57

标签: ruby arrays regex web-scraping

我试图从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

但这似乎也行不通。任何人都可以帮我这个或给我正确的指针吗?

1 个答案:

答案 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()后会得到什么?建设更慢,探索周围,以确保你了解你正在做的事情将帮助你避免达到死胡同。希望有所帮助!