簡體   English   中英

Python遍歷if / elif樹中的請求的json響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM