如何遍历具有多个页面的json

时间:2016-09-22 11:25:16

标签: python 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"}]

我使用'next'键进行迭代,但有时它指向“无效页面”(一个不存在的页面)。 JSON对象是否有关于每页上有多少条记录的规则?在这种情况下,我将使用它来估计可能的页数。

编辑:添加更多细节 json只有2个键['results','next']。如果有多个页面,则“下一个”键具有下一页的网址(as you can see in the output above)。否则,它包含“无”。 但问题是,有时候,它指的是下一页(不存在),而不是“无”。所以,我想知道我是否可以计算Json中的行并除以一个数字,以了解循环需要迭代的页数。

1 个答案:

答案 0 :(得分:0)

在我看来,使用urllib2或urllib.request是一个比curl更好的选择,以使代码更容易理解,但如果这是一个约束 - 我可以使用它; - )

假设json-response全部在一行中(否则你的json.loads将抛出异常),任务非常简单,这将允许你获取结果键后面的项目数量:

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的替代解决方案看起来应该是这样的(我没有测试过这个):

{{1}}

有关httplib2的更多内容以及为什么我建议阅读https://groups.google.com/forum/#!topic/jpos-users/X3r_PX7lgd4