2012-03-20 16 views
1

我想解析3個參數(這個工程),並請求一個文件,它有一堆txt和URLs。我試圖把每個網址放入一個數組中,我嘗試了一些正則表達式,但沒有運氣,並且使用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

你有沒有考慮過像HTTParty這樣的API客戶端,它會爲你解析JSON? – 2012-03-20 02:23:24

+0

我做了,但後來我雖然因爲我只需要刪除urls的我可能不需要它..我不知道json ..你會怎麼做呢? – cfernandezlinux 2012-03-20 17:39:18

回答

0

有了這樣HTTParty的API客戶端,你真的沒有知道的JSON,因爲響應解析成一個數據結構,你可以提取。你可以用一個簡單的類開始:

require 'httparty' 

class MyApi 
    include HTTParty 
    format :json 
end 

然後你就可以做到以下幾點:

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

和響應將被解析到一個哈希結構,你就可以拉你的網址,以一種可靠的方式。

如果您的API需要驗證或發佈數據,則很容易添加。寶石本身有several examples,所以你可以看到各種事情是如何完成的。

+0

好吧,我做到了這一點,並在irb上工作,直到一個地方.. – cfernandezlinux 2012-03-21 21:55:34

+0

好吧我做的事情就像file = MyApi.get (「http://#{HOST}/v1/dc/manifest /#{ID} /#{VERSION}」)然後我file.each do | item | puts item ['manifest'] ['files'] [ '網址']結束,但不工作,當我在irb上添加'網址'我可以得到['manifest'] ['files']內的所有子哈希值,如果我指定了哪一個,我只能得到url。 。例如像放置文件['清單'] ['文件'] ['1'] ['網址'] < - 這對irb工作,但因爲我需要得到所有網址這就是爲什麼我使用.each但它給了我一個不能轉換爲字符串錯誤或類似 – cfernandezlinux 2012-03-21 22:02:51

+0

從哈希中提取值是一個不同的主題。它可能很容易是另一個StackOverflow的問題。事實上,如果你發佈一個示例哈希和你的困境,我相信你會得到快速回答 – 2012-03-21 22:43:49

0

您應該首先用一個變量替換常量MYLINKS,例如, my_links。這將允許您將元素添加到my_links陣列。 Ruby會假設任何以大寫字母開頭的名字(例如MYLINKSMyLinks)都是一個常量。

#!/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 2012-03-20 17:38:21

相關問題