Разобрать веб-страницу и извлечь несколько массивов json


person Sun    schedule 14.11.2011    source источник


Ответы (1)


Есть много способов выполнить эту задачу, простой способ: HTML -> JS -> JSON -> Массив Ruby.

require 'open-uri'
require 'json'

html = open("http://www.highcharts.com/demo/").read
js = html.match(/series: (\[\{.*?\}\])/m)[1]
json = js.gsub(/(\w+):/i, '"\1":').gsub(/'/, '"')
series = JSON.parse(json)
# => [{"name"=>"Tokyo", "data"=>[7.0, 6.9, 9.5, 14.5, 18.2, ... 

Для более ортодоксального подхода (с использованием синтаксического анализатора Javascript) проверьте этот вопрос.

person tokland    schedule 14.11.2011
comment
согласен, это было самое элегантное решение, к которому я смог прийти - person Eugene; 14.11.2011
comment
Я немного запутался, вы извлекли соответствующую часть, но почему вы снова разбираете ее в Json через data = JSON.parse({ + json_string + })[series]. Что означает [серия]. Это уже в формате хеша, как я могу получить к нему доступ, извините, я новичок в рубине, но это именно то, что мне нужно, спасибо. - person Sun; 14.11.2011
comment
Я вижу, что вы можете получить доступ к различным индексам через данные [0], но как я могу получить доступ к Токио, а затем к его данным, указав его имя? - person Sun; 14.11.2011
comment
@Солнце: это? data.detect { | ч | h[имя] == Токио }[данные] - person tokland; 14.11.2011
comment
@Sun: обычно JSON - это объекты, но, видимо, JSON.parse принимает массив напрямую, поэтому я его обновлю. - person tokland; 14.11.2011
comment
@tokland Спасибо за помощь! - person Sun; 14.11.2011