如何在 Python 中从 JSON 数据中提取图片 URL

本文介绍了如何使用 Python 从包含嵌套字典的 JSON 数据中提取特定的图片 URL。通过 `requests` 库获取 JSON 数据,并使用 `get` 方法安全地访问嵌套字典中的目标值,避免因键不存在而导致的程序错误。本文提供了详细的代码示例和解释,帮助开发者轻松提取所需信息。

在使用 Python 处理 API 返回的 JSON 数据时,经常需要提取特定字段的值。当 JSON 数据包含嵌套的字典结构时,直接访问可能导致 KeyError 异常。本文将介绍如何安全有效地从嵌套的 JSON 字典中提取图片 URL。

假设我们已经通过 requests 库获取了 JSON 数据,并且解析后的数据存储在名为 character_data 的字典中。目标是从 character_data["decorations"]["avatarUrl"] 获取头像 URL。

以下代码展示了如何使用 get 方法安全地访问嵌套字典中的 avatarUrl:

import requests

def get_avatar_url(character_id):
    """
    从 D&D Beyond API 获取角色头像 URL。

    Args:
        character_id (int): 角色 ID。

    Returns:
        str: 头像 URL,如果找不到则返回空字符串。
    """
    req = requests.get(f"https://character-service.dndbeyond.com/character/v5/character/{character_id}")
    if req.status_code != 200:
        print(f"请求失败,状态码: {req.status_code}")
        return ""

    try:
        j = req.json()
        if not "success" in j or not "data" in j:
            print("JSON 数据格式不正确")
            return ""

        character_data = j["data"]
        avatar_url = character_data.get("decorations", {}).get("avatarUrl", "")
        return avatar_url

    except ValueError as e:
        print(f"JSON 解析失败: {e}")
        return ""

# 示例用法
character_id = 108291017  # 替换为实际的角色 ID
avatar_url = get_avatar_url(character_id)

if avatar_url:
    print(f"头像 URL: {avatar_url}")
else:
    print("无法获取头像 URL")

代码解释:

  1. requests.get(): 使用 requests 库向指定的 URL 发送 GET 请求,获取角色数据。
  2. req.status_code: 检查 HTTP 状态码,确保请求成功(状态码为 200)。
  3. req.json(): 将响应内容解析为 JSON 格式的 Python 字典。
  4. character_data.get("decorations", {}).get("avatarUrl", ""): 这是核心部分。
    • character_data.get("decorations", {}) 尝试获取 character_data 字典中键为 "decorations" 的值。如果 "decorations" 键不存在,则返回一个空字典 {} 作为默认值。
    • .get("avatarUrl", "") 接着尝试从 decorations 字典(或者空字典,如果 "decorations" 键不存在)中获取键为 "avatarUrl" 的值。如果 "avatarUrl" 键不存在,则返回一个空字符串 "" 作为默认值。

使用 get 方法的优势:

使用 get 方法可以避免因键不存在而导致的 KeyError 异常。如果直接使用 character_data["decorations"]["avatarUrl"],当 "decorations" 或 "avatarUrl" 键不存在时,程序会抛出异常。而 get 方法在键不存在时会返回指定的默认值,使代码更加健壮。

其他方法 (不推荐):

虽然可以使用 try...except 块来捕获 KeyError 异常,但这通常不是最佳实践,因为它会隐藏其他潜在的错误。

try:
    avatar_url = character_data["decorations"]["avatarUrl"]
except KeyError:
    avatar_url = ""

总结:

使用 get 方法是安全有效地从嵌套 JSON 字典中提取数据的推荐方法。它避免了 KeyError 异常,并允许您在键不存在时指定默认值,使代码更加健壮和易于维护。在处理来自 API 的 JSON 数据时,请始终考虑使用 get 方法来访问字典中的值。