使用Ruby从JSON获取所有URL

时间:2013-09-05 21:14:36

标签: ruby json url extract

如何使用ruby从JSON响应中提取所有URL? 我有一个返回JSON的URL(test.testurl.de/test?p=12),例如

...
images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/y.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/x.jpg",
format: "image/jpeg",
},
...

如果我尝试通过提取:

test = open("test.testurl.de/test?p=12").read
puts URI.extract(test)

然后我得到:

["http:", "http:", "http:"]

有人可以告诉我为什么我不会获得整个网址吗?

THX

2 个答案:

答案 0 :(得分:0)

我建议使用HTTP客户端,例如HTTParty,Typhoeus,或者更好的法拉第。

但是,如果你想自己动手使用JSON gem来解析响应,例如:

response = open("test.testurl.de/test?p=12").read
parsed = JSON.parse(response) rescue {}
parsed['images'].map { |image| image['path'] }

答案 1 :(得分:0)

images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
...
...

你的字符串不是json,所以你不能把它解析为json。那真的是什么回来了?

  

如果我尝试通过提取:

test = open("test.testurl.de/test?p=12").read
puts URI.extract(test)
     

然后我得到:

["http:", "http:", "http:"]

我得到了不同的东西:

require 'uri'

str =<<END_OF_JUNK
images: [
  {
    path: "http://static.mydomain.de/pics/z.jpg",
    format: "image/jpeg", 
  },

  {
    path: "http://static.mydomain.de/pics/y.jpg",
    format: "image/jpeg",
  },

  {
    path: "http://static.mydomain.de/pics/x.jpg",
    format: "image/jpeg",
  }
]
END_OF_JUNK

p URI.extract(str)


--output:--
["path:", "http://static.mydomain.de/pics/z.jpg", "format:", "path:", "http://static.mydomain.de/pics/y.jpg", "format:", "path:", "http://static.mydomain.de/pics/x.jpg", "format:"]

有了这个输出,我可以这样做:

results = results.select do |url|
  url.start_with? "http"
end

p results

--output:--
["http://static.mydomain.de/pics/z.jpg", "http://static.mydomain.de/pics/y.jpg", "http://static.mydomain.de/pics/x.jpg"]

但是,如果您发布的内容是,例如,将转换为json的ruby散列的一部分:

require 'json'
require 'uri'

hash = {
  images: [
    {
      path: "http://static.mydomain.de/pics/z.jpg",
      format: "image/jpeg", 
    },

    {
      path: "http://static.mydomain.de/pics/y.jpg",
      format: "image/jpeg",
    },

    {
      path: "http://static.mydomain.de/pics/x.jpg",
      format: "image/jpeg",
    }
  ]
}

str = JSON.dump(hash)
p str

--output:--
"{\"images\":[{\"path\":\"http://static.mydomain.de/pics/z.jpg\",\"format\":\"image/jpeg\"},{\"path\":\"http://static.mydomain.de/pics/y.jpg\",\"format\":\"image/jpeg\"},{\"path\":\"http://static.mydomain.de/pics/x.jpg\",\"format\":\"image/jpeg\"}]}"

然后你可以这样做:

results = URI.extract(str)
p results

--output:--
["http://static.mydomain.de/pics/z.jpg", "http://static.mydomain.de/pics/y.jpg", "http://static.mydomain.de/pics/x.jpg"]