[英]Python iterate over json response from requests in if/elif tree
我需要讓我的代碼經歷來自請求的json響應,方法如下:
{
"result": [
{
"id": "59c190c075529ad185ea03affa8842b6",
"type": "A",
"name": "islevel3down.com",
"content": "45.76.20.24",
"proxiable": true,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-12-15T17:03:11.560689Z",
"created_on": "2017-12-15T17:03:11.560689Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
},
{
"id": "25073fc3caaa457918aadf6da68b2dac",
"type": "A",
"name": "www.islevel3down.com",
"content": "45.76.20.24",
"proxiable": true,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-12-15T17:03:09.922229Z",
"created_on": "2017-12-15T17:03:09.922229Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
},
{
"id": "961392b581639d41d0a044f6709763aa",
"type": "TXT",
"name": "islevel3down.com",
"content": "keybase-site-verification=blah",
"proxiable": false,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-11-29T00:55:01.555837Z",
"created_on": "2017-11-29T00:55:01.555837Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
}
],
"result_info": {
"page": 1,
"per_page": 20,
"total_pages": 1,
"count": 3,
"total_count": 3
},
"success": true,
"errors": [],
"messages": []
}
我有if / elif代碼,需要通過響應並查找每個名稱字段,並且如果它與我所尋找的任何內容匹配((每次代碼捕獲JSON時可能以任何順序更改的順序), ID。 我設法使它與列表中的第一項一起使用,但是即使有其他問題,即使我正在嘗試response [1] [name] =='www.islevel3down.com'和response [1 ] ['type'] =='A”,它只會返回第一個項目,如何使它遍歷整個響應?
我的代碼是:
from variables import *
import requests
import json
def RecordsExist(zone, CLOUDFLARE_EMAIL, CLOUDFLARE_AUTH_KEY,
islevel3down.com, www.islevel3down.com):
url = "https://api.cloudflare.com/client/v4/zones/" + zone +
"/dns_records"
headers = {
'X-Auth-Email': CLOUDFLARE_EMAIL,
'X-Auth-Key': CLOUDFLARE_AUTH_KEY,
'Cache-Control': "no-cache"
}
r = requests.request("GET", url, headers=headers)
response = r.json()
print(response)
print("From Response")
for response in response['result']:
print(response)
print("first")
for r in response:
print(r)
if response['name'] == 'islevel3down.com' and
response['type'] == 'A':
ipv4Exists = True
ipv4Zone = response['id']
if ipv4Zone != '':
print('ipv4 =' + ipv4Zone)
return ipv4Zone
else:
ipv4Zone = False
return ipv4Zone
if response[1]['name'] == 'www.islevel3down.com' and response[1]['type'] == 'A':
ipv4wwwExists = True
ipv4wwwZone = response[1]['id']
print("Lol")
if ipv4wwwZone != '':
print("ipv4www =" +ipv4wwwZone)
return ipv4wwwZone
else:
ipv4wwwZone = False
return ipv4wwwZone
if response[2]['name'] == 'islevel3down.com' and response[2]['type'] == 'AAAA':
ipv6Exists = True
ipv6Zone = response[2]['id']
if ipv6Zone != '':
print('ipv6 =' + ipv6Zone)
return ipv6Zone
else:
ipv6Zone = False
return ipv6Zone
if response[3]['name'] == 'www.islevel3down.com' and response[3]['type'] == 'AAAA':
ipv6wwwExists = True
ipv6wwwZone = response[3]['id']
if ipv6wwwZone != '':
print('ipv6www =' + ipv6wwwZone)
return ipv6wwwZone
else:
ipv6wwwZone = False
return ipv6wwwZone
test = RecordsExist(zone, CLOUDFLARE_EMAIL, CLOUDFLARE_AUTH_KEY, islevel3down.com, www.islevel3down.com)
之所以只得到其中一個而忽略其他人,是因為您以return語句結束了函數的執行。 您可以將匹配項放在列表中,而不是返回,而是繼續循環響應,如下所示:
def record():
matches = []
response = json.load(open("js"))
for r in response['result']:
if r['name'] == 'islevel3down.com' and r['type'] == 'A':
ipv4Exists = True
ipv4Zone = r['id']
if ipv4Zone != '':
print('ipv4 =' + ipv4Zone)
else:
ipv4Zone = False
matches.append(ipv4Zone)
return matches
現在,您將在列表中找到所有匹配項,而不僅僅是找到的第一個。
您將返回函數的中間位置。 另外,您嘗試循環輸入錯誤的值。 此外,這些堆疊的ifs會創建許多不需要的代碼。 建議您嘗試更類似的方法:
lookup = (
('islevel3down.com', 'A', 'ipv4'),
('www.islevel3down.com', 'A', 'ipv4-www'),
('islevel3down.com', 'AAAA', 'ipv6'),
('www.islevel3down.com', 'AAAA', 'ipv6-www'),
)
zones = {}
for r in response['result']:
for l in lookup:
if r['name'] == l[0] and r['type'] == l[1] and r['id']:
zones[l[2]] = r['id']
print(zones)
import json
response = json.loads("""
{
"result": [
{
"id": "59c190c075529ad185ea03affa8842b6",
"type": "A",
"name": "islevel3down.com",
"content": "45.76.20.24",
"proxiable": true,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-12-15T17:03:11.560689Z",
"created_on": "2017-12-15T17:03:11.560689Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
},
{
"id": "25073fc3caaa457918aadf6da68b2dac",
"type": "A",
"name": "www.islevel3down.com",
"content": "45.76.20.24",
"proxiable": true,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-12-15T17:03:09.922229Z",
"created_on": "2017-12-15T17:03:09.922229Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
},
{
"id": "961392b581639d41d0a044f6709763aa",
"type": "TXT",
"name": "islevel3down.com",
"content": "keybase-site-verification=blah",
"proxiable": false,
"proxied": false,
"ttl": 1,
"locked": false,
"zone_id": "1163722f4a43f5bbee9af23c2f4c4c68",
"zone_name": "islevel3down.com",
"modified_on": "2017-11-29T00:55:01.555837Z",
"created_on": "2017-11-29T00:55:01.555837Z",
"meta": {
"auto_added": false,
"managed_by_apps": false
}
}
],
"result_info": {
"page": 1,
"per_page": 20,
"total_pages": 1,
"count": 3,
"total_count": 3
},
"success": true,
"errors": [],
"messages": []
}
""")
lookup = (
('islevel3down.com', 'A', 'ipv4'),
('www.islevel3down.com', 'A', 'ipv4-www'),
('islevel3down.com', 'AAAA', 'ipv6'),
('www.islevel3down.com', 'AAAA', 'ipv6-www'),
)
zones = {}
for r in response['result']:
for l in lookup:
if r['name'] == l[0] and r['type'] == l[1] and r['id']:
zones[l[2]] = r['id']
print(zones)
{
'ipv4': '59c190c075529ad185ea03affa8842b6',
'ipv4-www': '25073fc3caaa457918aadf6da68b2dac'
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.