如何从 ruby 中的这个标签中抓取字符串
How can I scrape the string from this tag in ruby
我目前正在尝试在 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
我是 Alex,BaseRails 的联合创始人之一。很高兴您现在开始从事自己的项目 - 这是开始应用所学知识的最佳方式。我想我会凑钱看看能不能帮上忙。
我会试试这个:
page.css(ul.details.none li div a)
这将抓取每个 <a>
标签,您将能够使用 .text
提取 link 的文本(例如 Solid Steel Radio Show、Palms Trax 等)。要理解上面的代码,请记住 .
表示 "with a class called...",space 表示 "that has the following nested inside"。
所以在英文中,"ul.details.none li div a" 被翻译成 "a <ul>
tag with a class called "details" 和另一个名为 "none" 的 class,里面嵌套了一个 <li>
标签,其中嵌套了一个 <div>
标签,其中嵌套了一个 <a>
标签。尝试一下,看看你是否可以找出如何将结果过滤到 DJ、Source 等中。
最后,我不确定为什么需要声明您的 subarray
。如果这是您使用它的唯一上下文,则不需要声明它。仅供参考,我们不需要在 BaseRails 课程中声明它的原因是因为 .split
函数 returns 默认情况下是一个数组。它不同于我们使用不同函数 (<<
) 的 name
、price
和 details
数组。 <<
函数可以在多种上下文中使用,因此我们必须清楚地表明我们正在使用它来向数组添加元素。
希望对您有所帮助!
我目前正在尝试在 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
我是 Alex,BaseRails 的联合创始人之一。很高兴您现在开始从事自己的项目 - 这是开始应用所学知识的最佳方式。我想我会凑钱看看能不能帮上忙。
我会试试这个:
page.css(ul.details.none li div a)
这将抓取每个 <a>
标签,您将能够使用 .text
提取 link 的文本(例如 Solid Steel Radio Show、Palms Trax 等)。要理解上面的代码,请记住 .
表示 "with a class called...",space 表示 "that has the following nested inside"。
所以在英文中,"ul.details.none li div a" 被翻译成 "a <ul>
tag with a class called "details" 和另一个名为 "none" 的 class,里面嵌套了一个 <li>
标签,其中嵌套了一个 <div>
标签,其中嵌套了一个 <a>
标签。尝试一下,看看你是否可以找出如何将结果过滤到 DJ、Source 等中。
最后,我不确定为什么需要声明您的 subarray
。如果这是您使用它的唯一上下文,则不需要声明它。仅供参考,我们不需要在 BaseRails 课程中声明它的原因是因为 .split
函数 returns 默认情况下是一个数组。它不同于我们使用不同函数 (<<
) 的 name
、price
和 details
数组。 <<
函数可以在多种上下文中使用,因此我们必须清楚地表明我们正在使用它来向数组添加元素。
希望对您有所帮助!