Создайте массив flashvars, используя hpricot - PullRequest
0 голосов
/ 21 апреля 2011

Ранее я использовал hpricot для захвата контента с веб-сайтов, которые находятся в пределах некоторых тегов HTML, однако я пытаюсь создать массив всех flashvars, найденных на этой странице http://view -источник: http://megavideo.com/?v=014U2YO9

require 'hpricot'
require 'open-uri'

flashvars = Array.new
doc = Hpricot(open("http://megavideo.com/?v=014U2YO9"))

for flashvars in (doc/"/param[@name='flashvars']") do
  flashvars << flashvar
end

Я пытался использовать приведенный выше фрагмент кода, надеюсь, я был на правильном пути, сможет ли кто-нибудь помочь мне в дальнейшем?

Спасибо

1 Ответ

1 голос
/ 21 апреля 2011

Вы использовали синтаксис, указывающий, что вы пытаетесь извлечь атрибуты из элементов <param>, но на этой странице нет такой разметки. Существует множество JavaScript-присваиваний свойствам объекта flashvar. Предполагая, что это то, что вы хотите, вам не нужен Hpricot, просто регулярное выражение для JS. Это похоже на работу:

require 'open-uri'
html = open("http://megavideo.com/?v=014U2YO9").read

flashvars = Hash[ html.scan( /flashvars\.(\w+)\s*=\s*["']?(.+?)["']?;/ ) ]

require 'pp' # Just for pretty output here
pp flashvars

#=> {"logintxt"=>"Login",
#=>  "registertxt"=>"Register",
#=>  "searchtxt"=>"Search videos",
#=>  "searchrestxt"=>"\"",
#=>  "useSystemFont"=>"0",
#=>  "size"=>"17",
#=>  "loginAct"=>"?c=login%26next%3Dv%253D014U2YO9",
#=>  "registerAct"=>"?c=signup",
#=>  "userAct"=>"?c=account",
#=>  "signoutAct"=>"javascript:signout()",
#=>  "myvideostxt"=>"My Videos",
#=>  "videosAct"=>"?c=myvideos",
#=>  "added"=>"2011-04-14",
#=>  "username"=>"beenerkeekee19952",
#=>  etc.

Обратите внимание, что это оставляет все значения в виде строк в Ruby, даже значения, которые были числами в JavaScript. Поскольку он удаляет начальные / конечные кавычки для строк JavaScript, в результате вы не можете различить flashvars.foo = 42; от flashvars.bar = "42";.

...