2016-09-22 14 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オブジェクトには、各ページにあるレコードの数に関する規則がありますか?その場合、私は可能なページ数を見積もるためにそれを使用します。

EDIT:詳細の追加 jsonには2つのキー['results'、 'next']があります。複数のページがある場合、「次へ」キーには次のページのURL(as you can see in the output above)があります。そうでなければ、「なし」が含まれています。 しかし、問題は「None」ではなく、次のページ(存在しない)を指していることです。だから、私はJsonで行を数えることができるかどうかを見たいと思って、ループで反復する必要があるページの数を知るために数値で割ります。私の意見で

+0

私には、あなたが達成しようとしていることは不明です。あなたの問題は、あなたがサーバーからいくつかのJSONを要求しているようです。 JSONには、より良い単語がないため、次のデータセットへのURLが含まれています。正しいURLの抽出に問題があるのですか、または応答から正しく抽出されないURLですか?後者の場合、問題はあなたのコードにありません。なぜ[urllib.request](https://docs.python.org/3.5/library/urllib.request.html)のようなビルトインのPythonソリューションの代わりにカールを使用していますか? – Maurice

+0

こんにちはモーリス、あなたの返事をありがとう。私は私の会社のプロキシの後ろに座っていて、うまく動作しています。 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-応答はすべて1行(そうでなければ、あなたの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をお勧めします。

関連する問題