【问题标题】:How to extract data using API and Python?如何使用 API 和 Python 提取数据?
【发布时间】:2019-10-29 12:09:08
【问题描述】:

我有一组服务器,我使用 API 来提取有关存储的数据。 要获取有关 storage uuid(在 json 中命名存储)的详细信息,我使用如下代码:

srvdet = requests.get('https://hhh.com/1.2/server/76856585', auth=HTTPBasicAuth('login', 'pass'))
srvdet_json = srvdet.json()
datas = srvdet.json()
print(datas)

结果为json:

{
   "server": {
      "boot_order": "",
      "core_number": "2",
      "created": ,
      "firewall": "off",
      "host": ,
      "hostname": "hello",
      "ip_addresses": {
         "ip_address": [
            {
               "access": "private",
               "address": "",
               "family": ""
            },
            {
               "access": "",
               "address": "",
               "family": "",
               "part_of_plan": ""
            }
         ]
      },
      "license": 0,
      "memory_amount": "",
      "nic_model": "",
      "plan": "",
      "plan_ipv4_bytes": "",
      "plan_ipv6_bytes": "0",
      "state": "started",
      "storage_devices": {
         "storage_device": [
            {
               "address": "",
               "boot_disk": "0",
               "part_of_plan": "",
               "storage": "09845",
               "storage_size": ,
               "storage_title": "",
               "type": ""
  
}

现在它工作得很好。问题是当我需要获得 "09845" 时,这是 storage 的价值。当我尝试使用此代码时:

for storage in datas['server']['storage_devices']['storage_device']:
    srvstorage = storage
    print(srvstorage)

结果是:

{'storage': '09845', 'storage_size':, 'address': '', 'boot_disk': '0', 'type': '', 'part_of_plan': 'yes', 'storage_title': ''}

我做错了什么?如何在变量中保存“09845”?

编辑:

现在我在尝试访问有关存储的详细信息时遇到错误。 我想提取 json 中 state 的备份状态:

{
   "storage": {
      "access": "private",
      "backup_rule": {},
      "backups": {
         "backup": []
      },
      "license": 0,
      "part_of_plan": "",
      "servers": {
         "server": [
            ""
         ]
      },
      "size": ,
      "state": "online",
      "tier": "",
      "title": "",
      "type": "",
      "uuid": "",
      "zone": ""
   }
}

当我执行这段代码时:

bkpdet = requests.get('https://fffff.com/1.2/storage/08475', auth=HTTPBasicAuth('login', 'pass'))
bkpdet_json = bkpdet.json()
datastg = bkpdet.json()
print(datastg)
for sts in datastg['storage']:
    bkpsts = sts['state']
    print(bkpsts)

我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: string indices must be integers

整个想法是最后使用此代码获取有关状态的信息:

if bkpsts == "online":
    print('Backup has been created.')
else bkpsts == "backuping":
    print('Backup creation is in progress.')
else:
    print(bkpdet.status_code)

我正在搜索,但仍然找不到这里有什么问题。

【问题讨论】:

  • 我猜你不需要这条线datastg = bkpdet.json()你已经将它解析为json。然后将datastg 替换为 bkpdet_json `.
  • 我发现编辑部分帖子的解决方案在这里:stackoverflow.com/questions/58609001/…>

标签: python json api loops


【解决方案1】:

当你想访问存储时错过了一个键,你循环它就可以了。但是在每次迭代中,您都会得到一个字典,您需要从中调用正确的键,在您的情况下为storage

for storage in datas['server']['storage_devices']['storage_device']: 
    srvstorage = storage.get("storage", None) 
    print(srvstorage)

注意

最好使用get方法,因为您可能会遇到内部没有存储信息的设备,使用get可以避免KeyError

【讨论】:

  • 就是这样!非常感谢! :D
  • @Brzozova 完美,请随时通过单击投票一下方的复选标记按钮来验证此答案。
【解决方案2】:

你可以这样做

for device in datas['server']['storage_devices']['storage_device']:
    device_storage = device['storage']
    print(device_storage)

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2021-11-24
    • 2017-04-16
    • 2021-09-25
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多