我创建了一个迭代多页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中的行并除以一个数字,以了解循环需要迭代的页数。
答案 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。