2016-09-22 3 views
0

다중 페이지 json 객체를 반복하는 프로그램을 만들었습니다.여러 페이지가있는 json을 반복하는 방법

def get_orgs(token,url): 
    part1 = 'curl -i -k -X GET -H "Content-Type:application/json" -H "Authorization:Bearer ' 
    final_url = part1 + token + '" ' + url 
    pipe = subprocess.Popen(final_url, shell=False,stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
    data = pipe.communicate()[0] 
    for line in data.split('\n'): 
     print line 
     try: 
      row = json.loads(line) 
      print ("next page url ",row['next']) 
     except : 
      pass 
    return row 
my_data = get_orgs(u'MyBeearerToken',"https://data.ratings.com/v1.0/org/576/portfolios/36/companies/") 

json으로 개체는 다음과 같습니다 : 나는 '다음'키를 반복 사용하고

[{results: [{"liquidity":"Strong","earningsPerformance":"Average"}] 
,"next":"https://data.ratings.com/v1.0/org/576/portfolios/36/companies/?page=2"}] 

하지만 시간이에 "잘못된 페이지"(존재하지 않는 페이지)을 가리 킵니다 . JSON 객체에는 각 페이지에 몇 개의 레코드가 있는지에 대한 규칙이 있습니까? 이 경우 가능한 한 페이지 수를 예상하는 데 사용합니다.

편집 : 세부 정보 추가 json에는 [결과], [다음]]의 키가 두 개 있습니다. 여러 페이지가있는 경우 '다음'키에 다음 페이지의 URL (as you can see in the output above)이 있습니다. 그렇지 않으면 '없음'이 포함됩니다. 그러나 문제는 때때로 '없음'대신 다음 페이지 (존재하지 않음)를 가리키는 것입니다. 그래서, Json에서 행을 셀 수 있고 루프가 얼마나 많은 페이지를 반복해야 하는지를 알기 위해 숫자로 나눌 수 있는지 알고 싶습니다. 제 생각에는

+0

나에게 당신이 무엇을 달성하려고하는지 명확하지 않습니다. 귀하의 문제는 당신이 서버에서 일부 JSON 요청하는 것 같습니다. JSON에는 더 나은 단어가 부족하여 다음 데이터 세트에 대한 URL이 포함되어 있습니다. 올바른 URL을 추출하는 데 문제가 있습니까? 아니면 응답에서 추출한 URL이 잘못 되었습니까? 나중에 문제가 귀하의 코드에 없습니다. 왜 [urllib.request] (https://docs.python.org/3.5/library/urllib.request.html)와 같은 내장 된 파이썬 솔루션 대신 컬을 사용하고 있습니까? – Maurice

+0

안녕하세요, Maurice, 답장을 보내 주셔서 감사합니다. 내 회사의 프록시 뒤에 앉아서 곱슬 곱슬하게 잘 작동합니다. urllib2 또는 요청의 경우 인증 오류가 발생합니다. – Tammy

+0

@Maurice, 문제에 대한 자세한 내용을 제공하는 질문을 편집했습니다. – Tammy

답변

0

은 urllib2를 사용하거나 urllib.request은 코드를 이해하기 쉽게하기 위해 컬보다 훨씬 더 좋은 옵션이 될 것입니다,하지만 그 제약의 경우 - 그 ;-)

는 가정 작업 할 수 있습니다

row = [{'next': 'https://data.ratings.com/v1.0/org/576/portfolios/36/companies/?page=2', 'results': [{'earningsPerformance':'Average','liquidity': 'Strong'}, {'earningsPerformance':'Average','liquidity': 'Strong'}]}] 
result_count = len(row[0]["results"]) 

: json으로 응답은 (그렇지 않으면 json.loads이 예외가 발생합니다), 작업이 매우 간단하고 이것이 당신이 주요 결과 뒤에 항목의 금액을 인출 할 수 있도록 모두 한 줄에 httplib2를 사용하는 대안 솔루션은 다음과 같이 보일 것입니다. (나는 이것을 테스트하지 않았습니다) :

import httplib2 
import json 
h = httplib2.Http('.cache') 
url = "https://data.ratings.com/v1.0/org/576/portfolios/36/companies/" 
token = "Your_token" 
try: 
    response, content = h.request(
     url, 
     headers = {'Content-Type': 'application/json', 'Authorization:Bearer': token} 
    ) 
    # Convert the response to a string 
    content = content.decode('utf-8') # You could get the charset from the header as well 
    try: 
     object = json.loads(content) 
     result_count = len(object[0]["results"]) 
     # Yay, we got the result count! 
    except Exception: 
     # Do something if the server responds with garbage 
     pass 
except httplib2.HttpLib2Error: 
    # Handle the exceptions, here's a list: https://httplib2.readthedocs.io/en/latest/libhttplib2.html#httplib2.HttpLib2Error 
    pass 

httplib2에 대한 자세한 내용은 왜 놀랍습니까? Dive Into Python을 읽어 보시기 바랍니다.

관련 문제