2017-02-05 3 views
0

Indeed Ruby API와 상호 작용할 수있는 작은 프로그램을 작성했습니다.API에서 해시 배열에서 반환 된 데이터를 추출하는 방법

하나의 직책을 인쇄 할 수 있지만 모든 직책을 반복하고 싶습니다. 여기

코드입니다 :

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 작업 제목처럼 실행하는 루프를 원하는 :

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

나는 그것이 정수를 기대 않다면 루프에 [i] 카운터를 넣어하는 방법을 모르겠어요.

그것은 실제로 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"=>""}, 

해시이지만, "결과"에 대한 값이 키 배열입니다 : 여기

는 데이터가 Indeep의 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 '과 같은 반복자를 사용하는 것은 관용적입니다. 하나의 오류. –