2013-04-05 2 views
0

Nokogiri로 페이지의 데이터 부분을 스크랩했습니다.Ruby 형식의 JSON 문자열

require 'net/http' 
require 'nokogiri' 
require 'open-uri' 
require 'json' 

sources = { 
    cb: "http://www.cbbankmm.com/fxratesho.php", 
} 

puts "Currencies from CB Bank are" 
if @page = Nokogiri::HTML(open(sources[:cb])) 
    (1..3).each do |i| 
     puts @page.css("tr")[i].text.gsub(/\s+/,'') 
    end 
end 

결과는

Currencies from CB Bank are 
USD873883 
SGD706715 
EURO11241135 

내가 JSON 형식 아래에 출력을 포맷하고 싶은 것입니다, 방법은 내가 위의 해시를 얻기 위해 사용해야 할 보석

{ 
    "bank":"CB", 
    "rates": { 
     "USD":"[873,883]", 
     "SGD":"[706,715]", 
     "EURO":"[1124,1135]" 
    } 
} 

또는 JSON 형식?

답변

2

일부 추상화는 생각이 될 수 있습니다.

class Currencies 

    def initialize(page, bank) 
    @page = page 
    @bank = bank 
    end 

    def parsed 
    @parsed ||= @page.css("tr").collect{ |el| el.text.gsub(/\s+/,'') } 
    end 


    def to_hash 
    { 
     bank: @bank, 
     rates: { 
     USD: usd, 
     SGD: sgd, 
     .... 
     } 
    } 
    end 

    def usd 
    parsed[0].gsub(/^USD/, '') 
    end 

    def sgd 
    parsed[1].gsub(/^SGD/, '') 
    end 

    ... 

end 

Currencies.new(Nokogiri::HTML(open(sources[:cb])), "CB").to_hash.to_json 
+0

감사합니다. 나는 그것을 밖으로 시도 할 것이다. –

1

Ruby에서 동일한 해시 구조를 만들고 예를 들어.

hash = { 
    "bank" => "CB", 
    "rates" => { 
     "USD" => "[873,883]", 
     "SGD" => "[706,715]", 
     "EURO" => "[1124,1135]" 
    } 
} 

hash.to_json 

이미 json 보석이 포함되어 있습니다. 분명히 현재 puts 문이있는 곳에서 Ruby 해시를 빌드합니다.

편집 : 레이아웃이 당신에게 중요하다면, 당신이 선호 할 수 있습니다 :

JSON.pretty_generate(hash) 
+2

인쇄 JSON처럼 사용하지만 AFAIK 꽤 인쇄를하지 않는 : 그래서, 아마도 클래스는 작업에 도움을주는. – atamanroman

+1

좋은 지적. OP가 구조 또는 prettified 버전을 원한다면 확실하지 않습니다. –

+0

결과를 해시로 가져 오려면 어떻게해야합니까? 이미 해시를 JSON으로 변환 할 수 있다고 생각합니다. –