2

1001tracklistsのトラックリストページからデータをスクレイピングできるようにしたいと思います。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;">

「tlp_433662」値のCSSセレクターがあります。ページ上の各曲には、独自のIDがあります。1つには「tlp_433662」があり、次の1つには「tlp_433628」などがあります。

NokogiriとXPathを使用して、トラックリストページにリストされているすべての曲を抽出する方法はありますか?スクレーパーが関連データの各セットを抽出するデータをループするように、以下にリストされている「データ」に対して「それぞれ」を「実行」したいと思うでしょう。これが私のRubyプログラムの始まりです:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "http://www.1001tracklists.com/tracklist/25122_lange-intercity-podcast-115-2013-03-06.html"
data = Nokogiri::HTML(open(url))
# what do do next? print out xpath loop code which extracts my data.
# code block I need help with
data.xpath.........each do |block|
block.xpath("...........").each do |span|
    puts stuff printing out what I want.
end
end

私が行う方法を知っている私の最終的な目標は、このRubyスクリプトをSinatraに持っていき、データを「Web化」して、このYouTubeビデオに示すようにいくつかの素晴らしいTwitterブートストラップCSSを追加することです:http ://www.youtube.com/watch ?v = PWI1PIvy4A8

データをスクレイピングして配列を印刷できるように、XPathコードブロックを手伝ってもらえますか?

4

3 に答える 3

2
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

...行からすべてのメタ情報を取得し、「Artist - Song [Publisher]」を出力する、より高度なバージョン

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-clientgemも使用しているので、ページを取得するために自由に使用してください。

于 2013-03-07T05:01:16.783 に答える
2

情報をハッシュの配列に収集するためのコードを次に示します。

HTML/CSS または jQuery の経験があれば読みやすいので、私は XPath よりも CSS アクセサーを使用することを好みます。

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]

ページのデータのサブセットを出力します。いくつかのマッサージの後、構造は次のようになります。

[
  {
    "byArtist"=>"Markus Schulz",
    "name"=>"The Spiritual Gateway (Transmission 2013 Theme)",
    "publisher"=>"COLDHARBOUR RECORDINGS",
    "url"=>"/track/108928_markus-schulz-the-spiritual-gateway-transmission-2013-theme/index.html",
    "tracklistTrack"=>[
        "/track/108928_markus-schulz-the-spiritual-gateway-transmission-2013-theme/index.html",
        "Markus Schulz - The Spiritual Gateway (Transmission 2013 Theme)"
      ],
    "title"=>[
      "/track/108928_markus-schulz-the-spiritual-gateway-transmission-2013-theme/index.html",
      "Markus Schulz - The Spiritual Gateway (Transmission 2013 Theme)"
    ]
  },
  {
    "byArtist"=>"Lange & Audrey Gallagher",
    "name"=>"Our Way Home (Noah Neiman Remix)",
    "publisher"=>"LANGE RECORDINGS",
    "url"=>"/track/119667_lange-audrey-gallagher-our-way-home-noah-neiman-remix/index.html",
    "tracklistTrack"=>[
      "/track/119667_lange-audrey-gallagher-our-way-home-noah-neiman-remix/index.html",
      "Lange & Audrey Gallagher - Our Way Home (Noah Neiman Remix)"
    ],
    "title"=>[
      "/track/119667_lange-audrey-gallagher-our-way-home-noah-neiman-remix/index.html",
      "Lange & Audrey Gallagher - Our Way Home (Noah Neiman Remix)"
    ]
  }
]
于 2013-03-07T05:02:13.980 に答える
0

指定された URL から 400 以上のschema.orgクラスをすべてスクレイピングし、それらを JSON として返すこの無料の Web サービスがあります。

http://scrappy.netfluid.org/

于 2014-04-04T16:44:53.277 に答える