2017-02-05 8 views
0

私はIndeed Ruby APIとやりとりするための小さなプログラムを書いた。APIからハッシュの配列から返されたデータを抽出する方法

私は1つのジョブタイトルを印刷できますが、すべてをループしたいと思います。

ここ

コードです:

require 'nokogiri' 
require 'indeed-ruby' 

client = Indeed::Client.new ("PUBLISHER_KEY_GOES_HERE") 

params = { 
    :q => 'python', 
    :l => 'vancouver', 
    :userip => '1.2.3.4', 
    :useragent => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2)', 
    :jobkeys => ["JOB_KEY_A", "JOB_KEY_B"] 
} 

data = client.search(params) 

# loop through all results and print the job title 
data.each do |d| 
    puts d["results"]["jobtitle"] 
end 

eachループに戻り、このエラーメッセージ:

i.rb:23:in `[]': no implicit conversion of String into Integer (TypeError) 
from i.rb:23:in `block in <main>' 
from i.rb:22:in `each' 
from i.rb:22:in `<main>' 

私は、このエラーメッセージは、私が文字列を入れてい整数を見つけるためにしようとしていると言っていると仮定["results"]または["jobtitle"]のいずれかです。この行は動作し、役職印刷し

puts data["results"][0]["jobtitle"] 

これは私が結果のハッシュの0番目の要素にアクセスして、jobtitle属性にアクセスすることができます意味を。

私はこれと印刷3つのジョブのタイトルのように実行するループにしたい:私はそれは整数を期待していた場合、ループに[i]カウンターを置くするかどうかはわかりません

puts data["results"][0]["jobtitle"] 
puts data["results"][1]["jobtitle"] 
puts data["results"][2]["jobtitle"] 

。ここで

は、データがIndeepのAPIから戻ってくるように見えるものです:

{"version"=>2, 
"query"=>"python", 
"location"=>"vancouver", 
"paginationPayload"=>"", 
"radius"=>25, 
"dupefilter"=>true, 
"highlight"=>true, 
"totalResults"=>483, 
"start"=>1, 
"end"=>10, 
"pageNumber"=>0, 
"results"=> 
    [{"jobtitle"=>"Junior Software Developer", 
    "company"=>"LaunchCode", 
    "city"=>"Portland", 
    "state"=>"OR", 
    "country"=>"US", 
    "formattedLocation"=>"Portland, OR", 
    "source"=>"LaunchCode", 
    "date"=>"Fri, 03 Feb 2017 04:10:27 GMT", 
    "snippet"=> 
    "Familiarity with an at least one imperative (Java, JavaScript, PHP, C#, Objective-C, C/C++, <b>Python</b>, Ruby, etc.). Don’t have a CS degree?...", 
    "url"=> 
    "http://www.indeed.com/viewjob?jk=9f75f0ea8825e3a8&qd=X0KuMlb--hp3Z0o2UU7dJOXoIlOcgm8VSZO61KKa0UOtGpLfFk1WY111OhfFWzZjMBRv9LrdGhB8olLNQGabmQRFit3-lRPP9j12GNvnf88&indpubnum=4334069173238194&atk=1b87s51b1a0kqb7s", 
    "onmousedown"=>"indeed_clk(this,'782');", 
    "jobkey"=>"9f75f0ea8825e3a8", 
    "sponsored"=>false, 
    "expired"=>false, 
    "indeedApply"=>false, 
    "formattedLocationFull"=>"Portland, OR", 
    "formattedRelativeTime"=>"2 days ago", 
    "stations"=>""}, 

実際にAPIからの応答がハッシュですが、「結果」キーの値が配列であるように見えますハッシュの内側。

ウルサスから以下の応答が動作:

これも働いていた:ここ

for i in 1...10 
    puts data["results"][i]["jobtitle"] 
end 

が出力されますので、

Junior Software Developer 
Data Scientist 
Python Developer 
Python Automation Developer - Hillsboro, OR 
Computer Vision Engineer 
Python Web Engineer 
EMS Network Applications Engineer II 
Software Engineer 
Python Developer (full-stack) 
Electrical Engineer, EMS Network Applications 
+0

ようこそ何かを行うことができます。 「[mcve]」をお読みください。サンプルデータは構文的に正しくないため、問題を実証するために必要な最小限に減らす必要があります。テキストに「編集」タグや「更新」タグを使用しないでください。まるでそこにあったかのように体に変化を組み込む。私たちが知る必要がある場合、何かがいつどこで変わったかを伝えることができます。 –

答えて

1

data["results"]が配列です。ルビでは、配列を通過するためのインデックスは必要ありません。あなたは、スタックオーバーフローに、あなたのケースで

[1, 2, 3].each do |i| 
    puts i 
end 

よう

data["results"].each do |item| 
    puts item["jobtitle"] 
end 
+0

しかし、インデックスは必要ありません。それぞれがより鮮明でエレガントです。 – Ursus

+0

Rubyでは、 'each'や' map'のようなイテレータを使って、 1つのエラー。 –

関連する問題