2013-03-07 7 views
2

Я хочу, чтобы убрать данные со страницы списка дорожек в 1001tracklists. Пример из URL является:Скребковые данные треков из HTML?

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;"> 

Имеется селектор CSS с значением «tlp_433662». Каждая песня на странице будет иметь свой собственный уникальный идентификатор. У одного будет «tlp_433662», а у следующего будет «tlp_433628» или что-то подобное.

Есть ли способ извлечь все песни, перечисленные на странице списка треков, с помощью Nokogiri и XPath? Я, вероятно, захочу «сделать» «каждый» по моим «данным», указанным ниже, чтобы скребок перебирал данные, извлекающие каждый набор релевантных данных. Вот это начало моей программы Руби:

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, чтобы Синатры в «Webify» данные и добавить некоторые интересные Twitter Bootstrap CSS, как показано в этом видео на youtube: http://www.youtube.com/watch?v=PWI1PIvy4A8

Можете ли вы помочь мне с блоком кода XPath, чтобы я мог очистить данные и распечатать массив?

+0

Try ' // div [@ itemtype = "http://schema.org/MusicRecording"] ' – Blender

+1

Вы должны как минимум _try_ сделать это сами, прежде чем обращаться за помощью. – pguardiario

+0

Я пробовал, и именно поэтому я спрашиваю.Часть xpath является новой для меня, и я прочитал документацию, но у меня все еще есть проблемы. Я искал и не стал бы задавать этот вопрос, если бы не дал ему несколько попыток учиться. – god

ответ

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 

... более продвинутая версия, которая захватывает всю мета информацию из строки и печатает Художника»- Песня [Издательство]

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-client, поэтому не стесняйтесь использовать все, что хотите получить страницу.

+0

только из любопытства, какова была точка этого прокси-сервера? – pguardiario

+0

Огонь, я случайно оставил код. Написал это на работе, и у меня работает cntlm на моей машине, которая является прокси-сервером NTLM. Это не обязательно, если вы работаете в среде без доверенности. – Strelok

+0

Стрелок, Большое вам спасибо за помощь. Я двигаюсь вместе со скребками этих данных. Вы сделали мой день. Я удалил прокси-строку, поскольку она не нужна в моей среде. Следующим шагом будет вычисление инструкции if else, чтобы проверить, является ли значение «издателя» равным нулю. Какие-нибудь рекомендации здесь? Я хотел бы проверить, существует ли значение издателя, и если он не выполняет следующие действия: puts "# {artist} - # {name}" [# {recordlabel}] "или помещает" # {artist} - # { name} "[Unknown]" Также не найден трек, показывающий идентификатор ID, код генерирует исключение: 'attr ': undefined method' attribute' для nil: NilClass – god

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] 

Какая выдает подмножество данных страницы. После некоторого массирования структуры выглядит следующим образом:

[ 
    { 
    "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)" 
    ] 
    } 
] 
0

Существует этот свободный вебсервис которым скрап всех 400+ Schema.org классы от данного URL и вернуть их обратно в формате JSON

http://scrappy.netfluid.org/

Смежные вопросы