【问题标题】:Scraping tracklist抓取曲目列表
【发布时间】:2015-03-19 11:06:56
【问题描述】:

我正在尝试从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

但这似乎也不起作用。任何人都可以帮助我或给我正确的指示吗?

【问题讨论】:

    标签: ruby arrays regex web-scraping


    【解决方案1】:

    这是发生了什么:

    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') 为您提供每个人 &lt;li&gt;,如下所示:

      <li>Rick Wilhite...</li>
      <li>Edward...</li>
      ...
      <li>Klara Lewis...</li>
    

    这一次,您将循环运行 17 次,每个 &lt;li&gt; 标记一次。第一次通过时,.split(" - ") 应用于文本并存储在 subarray 变量中。问题是下一次循环时,subarray 被第二个&lt;li&gt; 的分割文本覆盖。所以在最后一次通过后,subarray 变量的唯一内容是最终&lt;li&gt; 的拆分文本:“Klara Lewis”和“Shine [Editions Mego]”。

    我认为您已经大致了解了如何从网站上进行抓取,但我建议您逐步构建脚本,以便您准确了解每个步骤中正在执行的操作。例如,使用puts 检查page.css('ol') 为您提供了什么以及它与page.css('ol li') 有何不同。当它通过一个循环时会发生什么?申请.split()会得到什么?更慢地建造并四处探索以确保您了解自己在做什么将帮助您避免陷入死胡同。希望对您有所帮助!

    【讨论】:

    • 绝对又一次发现了伙伴,现在完全明白了,得到了它的工作!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 2019-12-23
    • 1970-01-01
    • 2015-10-11
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多