парсинг сайта на ruby

Ребята, помогите, пожалуйста. Осваиваю ruby — никак не могу победить маленький парсер.
Знаю, что можно через %r{} или через nokogiri, но никак не выходит :(

Есть код страницы:
trackinfo: [{«title_link»:"/track/alexandrina-rain",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:1,«private»:null,«duration»:196.413,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Alexandrina & Rain»,«id»:2541418463,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=59ef453d6ec9600d46a1176cfa298bf3&id=2541418463&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/black-piano",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:2,«private»:null,«duration»:134.885,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Black Piano»,«id»:2022937903,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=b996ee6723d6992597ef3d49b660b277&id=2022937903&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/blood-runs-cold",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:3,«private»:null,«duration»:187.212,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Blood Runs Cold»,«id»:2548956942,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=70ce41cd815abe97d6cedf4528e8066a&id=2548956942&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/fight",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:4,«private»:null,«duration»:118.254,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Fight»,«id»:906575690,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=2120a1759ff1994dc61d815c734774e6&id=906575690&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/musicxcans",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:5,«private»:null,«duration»:179.537,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Musicxcans»,«id»:1267134395,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=8330734577ce49ec9e101aca697c2a5b&id=1267134395&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/tease",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:6,«private»:null,«duration»:232.142,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Tease»,«id»:3336608674,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=92eabc6741a1961eaa8791539fada165&id=3336608674&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/thank-you",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:7,«private»:null,«duration»:166.313,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Thank You»,«id»:2663170132,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=be76ad083d4c4438b13c5ca7f3f5848d&id=2663170132&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/the-eye",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:8,«private»:null,«duration»:134.64,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«The Eye»,«id»:439915119,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=fe611b59d8bc4d116d9ce78dc244b508&id=439915119&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/untitled-1",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:9,«private»:null,«duration»:137.002,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«Untitled #1»,«id»:3954331131,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=c7af37d9f2dc017b1e47bba09e80d473&id=3954331131&stream=1&ts=1368611818.0»},«free_album_download»:false},{«title_link»:"/track/you-are",«lyrics»:null,«download_tooltip»:«name your price high quality formats»,«has_lyrics»:false,«sizeof_lyrics»:0,«license_type»:1,«streaming»:1,«has_info»:false,«alt_link»:null,«track_num»:10,«private»:null,«duration»:195.005,«is_downloadable»:true,«encoding_error»:null,«album_preorder»:false,«title»:«You Are»,«id»:2370762971,«is_draft»:false,«has_free_download»:null,«encoding_pending»:null,«unreleased_track»:false,«file»:{«mp3-128»:«popplers5.bandcamp.com/download/track?enc=mp3-128&fsig=940a0d3e30c6185c214640df787c7952&id=2370762971&stream=1&ts=1368611818.0»},«free_album_download»:false}],

как КРАСИВО поместить все участки между «mp3-128»:" и "\"" в массив, получив массив из прямых ссылок на файл?

у меня тут жесть вида:
start = 0
while data[start..data.length].include?(search_track_uri) == true

file0 = start + data[start..data.length].index(search_track_uri) + search_track_uri.length
file1 = file0 + data[file0..data.length].index("\"") — 1
tracks_uri.insert(0, data[file0..file1])

title0 = data[0..file0].rindex(search_track_title) + search_track_title.length
title1 = title0 + data[title0..data.length].index("\"") — 1
if tracks_uri.size < 10
tracks_title.insert(0, '0' + tracks_uri.size.to_s + ' — ' + artist + ' — ' + data[title0..title1])
else
tracks_title.insert(0, tracks_uri.size.to_s + data[title0..title1])
end

start = file1
end

и все равно все как-то не так.
  • Вопрос задан
  • 4052 просмотра
Решения вопроса 1
jj_killer
@jj_killer
Это же просто json, парсим его, и достаем ссылки. Предположим, что в raw_json, лежат ваши данные, а url_arr масиив для ссылок.

require 'json'

json_data = JSON.parse raw_json
url_arr   = []

json_data.each { |t| url_arr << t["file"]["mp3-128"] }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@quozd
data.scan(/"mp3-128":"(.*?)"}/g)


потом удалите лишние «mp3-128»:" в начале и "} в конце
Ответ написан
Комментировать
@himik
есть хороший гем mechanize

a.get('http://google.com/') do |page|
  page.links_with(:href => /"mp3-128":"(.*?)"}/g).each do |link|
    # some code
  end
end


что-то вроде того
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы