Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从HTML中抓取轨迹数据?_Ruby_Xpath_Sinatra_Web Scraping_Nokogiri - Fatal编程技术网

Ruby 从HTML中抓取轨迹数据?

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

我希望能够从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]
我想以以下格式从本页中取出所有歌曲:

$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 &amp; Beyond">
<meta itemprop="name" content="Black Room Boy (Above &amp; 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 &amp; Beyond - Black Room Boy (Above &amp; Beyond Club Mix)</a>&thinsp;</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