2012-03-20 1 views
1

Я пытаюсь разобрать 3 аргумента (это работает) и запросить файл, в котором есть куча txt и URL-адресов. Я пытаюсь поместить каждый URL в массив, который я попробовал с некоторым регулярным выражением без везения, а также с scan(URI.regexp) et.c и не могу видеть, что я делаю неправильно.Попытка разобрать все URL-адреса из файла или в этом случае удаленный URL-адрес

#!/usr/bin/env ruby 
require 'uri' 
require 'open-uri' 

HOST=ARGV[0] 
ID=ARGV[1] 
VERSION=ARGV[2] 
MYLINKS = Array.new 

file = open("http://#{HOST}/v1/dc/manifest/#{ID}/#{VERSION}").read 

file.each_line do |line| 
    #puts "doing #{line}" # this works.. 
    MYLINKS << URI.extract(line, ['http', 'https']) 
end 

PS: файл является файлом JSON. Это все работает над скриптом Bash, но я переношу его на Ruby. В сценарии Bash загрузить файл в /tmp я разобрать его с awk/tr т.д.

+0

Вы рассматривали клиент API, такой как HTTParty, который будет анализировать JSON для вас? –

+0

Я сделал это, но потом я, хотя я просто должен был отключить URL-адреса, может быть, мне это не понадобится .. и я понятия не имею о json .. как вы это сделаете? – cfernandezlinux

ответ

0

С клиентом API, как HTTParty вы действительно не должны знать JSON, потому что ответы обрабатываются в структуре данных, вы можете извлечь. Вы можете начать с простого класса:

require 'httparty' 

class MyApi 
    include HTTParty 
    format :json 
end 

Затем вы можете сделать следующее:

response = MyApi.get("http://#{HOST}/v1/dc/manifest/#{ID}/#{VERSION}") 

и ответ будет анализироваться в хэш-структуру, что вы будете в состоянии вытащить ваши URL-адреса из надежным способом.

Если ваш API требует аутентификации или публикации данных, его легко добавить. В самом камне есть several examples, поэтому вы можете видеть, как делаются разные вещи.

+0

ok Я сделал это и работаю на irb до одного места. – cfernandezlinux

+0

ОК, что я делаю, это что-то вроде файла = MyApi.get («http: // # {HOST}/v1/dc/manifest/# {ID}/# {VERSION}"), тогда я file.each do | item | puts item ['manifest'] ['files'] [ 'url'] end, но не работает, когда я добавляю 'url' также в irb. Я могу получить все вспомогательные хэши внутри ['manifest'] ['files'], и я могу получить только URL-адрес, если я выясню, какой из них. например, puts file ['manifest'] ['files'] ['1'] ['url'] <- это работает на irb, но поскольку мне нужно получить ВСЕ URL-адрес, вот почему я использую .each, но это дает мне возможность преобразовать строку в строкую ошибку или аналогичную. – cfernandezlinux

+0

Извлечение значений из хеша - это другая тема. Это может быть просто другой вопрос StackOverflow. На самом деле, если вы публикуете образец хэша и свою дилемму, я уверен, что вы получите быстро отвечает. –

0

Вы должны начать с замены постоянной MYLINKS с помощью переменной, например my_links. Это позволит вам добавлять элементы в массив my_links. Ruby будет считать, что любое имя, начинающееся с прописной буквы (например, MYLINKS, MyLinks), является константой.

#!/usr/bin/env ruby 
require 'uri' 
require 'open-uri' 

HOST=ARGV[0] 
ID=ARGV[1] 
VERSION=ARGV[2] 
my_links = [] 

file.each_line do |line| 
    my_links << URI.extract(line, ['http', 'https']) 
end 
+0

@luiism привет, спасибо за ответ имеет смысл, но все еще не лишен URL-адреса из каждой строки :-( – cfernandezlinux