Ruby 从HTML中抓取轨迹数据?
我希望能够从1001曲目列表中的曲目列表页面中获取数据。URL示例如下:Ruby 从HTML中抓取轨迹数据?,ruby,xpath,sinatra,web-scraping,nokogiri,Ruby,Xpath,Sinatra,Web Scraping,Nokogiri,我希望能够从1001曲目列表中的曲目列表页面中获取数据。URL示例如下: http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html 以下是数据如何显示在页面上的示例: Above & Beyond - Black Room Boy (Above & Beyond Club Mix) [ANJUNABEATS] 我想以以下格式从本页中取出所有歌曲: $byA
http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html
以下是数据如何显示在页面上的示例:
Above & Beyond - Black Room Boy (Above & Beyond Club Mix) [ANJUNABEATS]
我想以以下格式从本页中取出所有歌曲:
$byArtist - $name [$publisher]
查看此页面的HTML后,我要查找的内容似乎以HTML5元数据格式存储:
<td class="" id="tlptr_433662">
<a name="tlp_433662"></a>
<div itemprop="tracks" itemscope itemtype="http://schema.org/MusicRecording" id="tlp5_content">
<meta itemprop="byArtist" content="Above & Beyond">
<meta itemprop="name" content="Black Room Boy (Above & Beyond Club Mix)">
<meta itemprop="publisher" content="ANJUNABEATS">
<meta itemprop="url" content="/track/103905_above-beyond-black-room-boy-above-beyond-club-mix/index.html">
<span class="tracklistTrack floatL"id="tr_103905" ><a href="/track/103905_above-beyond-black-room-boy-above-beyond-club-mix/index.html" class="">Above & Beyond - Black Room Boy (Above & Beyond Club Mix)</a> </span><span class="floatL">[<a href="/label/1037_anjunabeats/index.html" title="Anjunabeats">ANJUNABEATS</a>]</span>
<div id="tlp5_actions" class="floatL" style="margin-top:1px;">
我的最终目标(我知道怎么做)是将这个Ruby脚本带到Sinatra“webify”数据,并添加一些不错的Twitter引导CSS,如youtube视频所示:
你能帮我处理XPath代码块吗?这样我就可以刮取数据并打印数组了
require 'nokogiri'
require 'rest-client'
url = 'http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html'
page = Nokogiri::HTML(RestClient.get(url,:user_agent=>'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'), nil, 'UTF-8');
page.css('table.detail tr.tlpItem').each do |row|
artist = row.css('meta[@itemprop="byArtist"]').attr('content')
name = row.css('meta[@itemprop="name"]').attr('content')
puts "#{artist} - #{name}"
end
…一个更高级的版本,它从行中获取所有元信息并打印艺术家歌曲[出版商]
require 'nokogiri'
require 'rest-client'
url = 'http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html'
page = Nokogiri::HTML(RestClient.get(url,:user_agent=>'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'), nil, 'UTF-8');
page.css('table.detail tr.tlpItem').each do |row|
meta = row.search('meta').each_with_object({}) do |tag, hash|
hash[tag['itemprop']] = tag['content']
end
puts "#{meta['byArtist']} - #{meta['name']} [#{meta['publisher']||'Unknown'}]"
end
您可以获得其余属性的图片。您需要执行一些错误/是否存在?正在检查,因为某些歌曲没有所有属性。但这会让你走上正轨。我还使用了rest客户端
gem,因此您可以随意使用任何想要检索页面的内容
…一个更高级的版本,它从行中获取所有元信息并打印艺术家歌曲[出版商]
require 'nokogiri'
require 'rest-client'
url = 'http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html'
page = Nokogiri::HTML(RestClient.get(url,:user_agent=>'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'), nil, 'UTF-8');
page.css('table.detail tr.tlpItem').each do |row|
meta = row.search('meta').each_with_object({}) do |tag, hash|
hash[tag['itemprop']] = tag['content']
end
puts "#{meta['byArtist']} - #{meta['name']} [#{meta['publisher']||'Unknown'}]"
end
您可以获得其余属性的图片。您需要执行一些错误/是否存在?正在检查,因为某些歌曲没有所有属性。但这会让你走上正轨。我还使用了
rest客户机
gem,因此可以随意使用您想要检索页面的任何内容。以下是一些代码,用于将信息收集到哈希数组中
我更喜欢使用CSS访问器而不是XPath,因为如果您有任何HTML/CSS或jQuery经验,它们更可读
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html'))
data = doc.search('tr.tlpItem div[itemtype="http://schema.org/MusicRecording"]').each_with_object([]) do |div, array|
hash = div.search('meta').each_with_object({}) do |m, h|
h[m['itemprop']] = m['content']
end
link = div.at('span a')
hash['tracklistTrack'] = [ link['href'], link.text ]
title = div.at('span.floatL a')
hash['title'] = [title['href'], title.text ]
array << hash
end
pp data[0, 2]
下面是一些将信息收集到哈希数组中的代码 我更喜欢使用CSS访问器而不是XPath,因为如果您有任何HTML/CSS或jQuery经验,它们更可读
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html'))
data = doc.search('tr.tlpItem div[itemtype="http://schema.org/MusicRecording"]').each_with_object([]) do |div, array|
hash = div.search('meta').each_with_object({}) do |m, h|
h[m['itemprop']] = m['content']
end
link = div.at('span a')
hash['tracklistTrack'] = [ link['href'], link.text ]
title = div.at('span.floatL a')
hash['title'] = [title['href'], title.text ]
array << hash
end
pp data[0, 2]
有一个免费的Web服务,它从给定的url中刮取所有400+schema.org类,并将它们作为JSON返回
有一个免费的Web服务,它从给定的url中刮取所有400+schema.org类,并将它们作为JSON返回
试试
//div[@itemtype=”http://schema.org/MusicRecording“]
在请求帮助之前,您至少应该自己尝试一下。我已经尝试过了,这就是我请求帮助的原因。xpath部分对我来说是新的,我已经阅读了文档,但仍然有问题。我已经搜索过了,如果我没有几次尝试学习的话,我不会问这个问题。首先,你必须使用//div[@itemprop=“tracks”]
找到所有的轨迹节点,然后遍历它们并使用//meta[@itemprop=“byArtist”]/@content
(例如获取艺术家的名字)来获取你的valuesTry//div[@itemtype>="http://schema.org/MusicRecording"]
在寻求帮助之前,你至少应该自己尝试一下。我已经尝试过了,这就是我为什么要问的原因。xpath部分对我来说是新的,我读过文档,但仍然有问题。如果我没有尝试过几次学习,我已经搜索过,也不会问这个问题。首先,你必须使用//div[@itemprop=”跟踪“]
以查找所有跟踪节点,然后遍历它们并使用//meta[@itemprop=“byArtist”]/@content
(例如获取艺术家的姓名)为了得到你的价值观,我无意中留下了代码。这是我在工作时写的,我让cntlm在我的机器上运行,这是一个NTLM身份验证代理。如果你在一个没有代理的环境中运行,这显然是不需要的。Strelok,非常感谢你的帮助。我正在处理这些数据。你让我很开心。我在工作时删除了代理行在我的环境中不需要t。我的下一步是找出一个if-else语句来检查“publisher”值是否为零。这里有什么指导吗?我想检查publisher值是否存在,以及它是否执行以下操作:放置“{artist}-{name}”[{recordlabel}]”或放置“{artist}-{name}”[未知]“也找不到显示ID-ID的轨迹代码引发异常:attr]:未定义的方法
attribute”对于nil:NilClassWhoops,我意外地将代码留在了中。这是我在工作中写的,我的机器上运行着cntlm,这是一个NTLM身份验证代理。如果你在一个没有代理的环境中运行,这显然是不需要的。Strelok,非常感谢你的帮助。我正在处理这些数据。你让我开心。我删除了代理行,因为在我的环境中不需要它。我的下一步是找出一个if-else语句来检查“publisher”值是否为nil。这里有什么指导吗?我想检查发布者值是否存在,如果它没有执行以下操作:放置“{artist}-{name}”[{recordlabel}]”或放置“{artist}-{name}”[Unknown]”也没有找到显示ID-ID的轨迹代码引发异常:attr:attr]:nil:NilClass的未定义方法
attribute