如何在ruby中从此标签中刮取字符串

时间:2015-03-16 14:48:18

标签: css ruby web-scraping

我目前正在尝试在Codecademy / Baserails之外进行我的第一个正确的项目,并且可以使用一些指针。我正在使用刮刀作为其中一个Baserails项目的一部分,作为工作的基础。我的目标是获得字符串“Palms Trax”并将其存储在名为DJ的数组中。我还希望获得字符串“Solid Steel Radio Show”并将其存储在名为source的数组中。我的计划是将详细信息部分中的所有行提取到子阵列中,然后将其过滤到DJ和源阵列中,但如果有更好的方法,请告诉我。我一直在尝试各种不同的组合,比如'.details none.li.div','ul details none.li.div.a'等,但似乎无法在正确的组合中绊倒。也有人可以向我解释为什么代码

page.css('ol').each do |line|
subarray = line.text.strip.split(" - ")
end

只有在我在循环之外声明子流的时候才有效,就像在我从事这项工作的Baserails项目中那样似乎并非如此。

以下是相关的html:

    <!-- Infos -->
   <ul class="details none">
      <li><span>Source</span><div>      <a href="http://solidsteel.ninjatune.net/" target="_blank">Solid Steel Radio Show</a></div></li>
      <li><span>Date</span><div>2015.02.27</div></li>
      <li><span>Artist</span><div><a href="http://www.electronic-battle-weapons.com/mix-artist/palms-trax/" rel="tag">Palms Trax</a></div></li>
      <li><span>Genres</span><div><a href="http://www.electronic-battle-weapons.com/mix-genre/deep-house/" rel="tag">Deep House</a><a href="http://www.electronic-battle-weapons.com/mix-genre/experimental/" rel="tag">Experimental</a><a href="http://www.electronic-battle-weapons.com/mix-genre/house/" rel="tag">House</a><a href="http://www.electronic-battle-weapons.com/mix-genre/minimal/" rel="tag">Minimal</a><a href="http://www.electronic-battle-weapons.com/mix-genre/techno/" rel="tag">Techno</a></div></li>
      <li><span>Categories</span><div><a href="http://www.electronic-battle-weapons.com/releases-category/radio-shows/" rel="tag">Radio Shows</a><a href="http://www.electronic-battle-weapons.com/releases-category/solid-steel-radio-show/" rel="tag">Solid Steel Radio Show</a></div></li>
      <li><span>File Size</span><div>      135 MB</div></li>
      <li><span>File Format</span><div>      MP3 Stereo 44kHz 320Kbps</div></li>
   </ul>
到目前为止

和我的代码:

 require "open-uri"
require "nokogiri"
require "csv"

#store url to be scraped
url = "http://www.electronic-battle-weapons.com/mix/solid-steel-palms-trax/"

#parse the page

page = Nokogiri::HTML(open(url))

#initalize empty arrays
details = []
dj = []
source = []
artist = []
track = []
subarray =[]
#store data in arrays


page.css('ul details none.li.div').each do |line|

    details = line.text.strip
end
puts details

page.css('ol').each do |line|
    subarray = line.text.strip.split(" - ")

end

1 个答案:

答案 0 :(得分:0)

我是Alex,BaseRails的联合创始人之一。很高兴您现在开始处理自己的项目 - 这是开始应用您所学知识的最佳方式。我以为我会参与进来,看看能不能帮忙。

我试试这个:

page.css(ul.details.none li div a)

这将获取每个<a>标签,您将能够使用.text提取链接文本(例如Solid Steel Radio Show,Palms Trax等) 。要理解上面的代码,请记住.表示&#34;有一个名为...&#34;的类。并且空格意味着&#34;具有以下嵌套内部&#34;。

所以在英语中,&#34; ul.details.none li div a&#34;被翻译成&#34; <ul>标签,其中包含一个名为&#34;详细信息&#34;另一个名为&#34; none&#34;嵌套在其中的<li>标记,其中嵌套有<div>标记,其中包含<a>标记。试试看,然后看看你是否可以弄清楚如何将结果过滤成DJ,Source等。

最后,我不确定为什么需要声明subarray。如果这是您使用它的唯一环境,则不应该声明它。仅供参考我们不需要在BaseRails课程中声明它的原因是因为.split函数默认返回一个数组。它与我们的namepricedetails数组不同,我们使用不同的函数(<<)。 <<函数可以在多个上下文中使用,因此我们必须明确表示我们正在使用它来向数组中添加元素。

希望有所帮助!