使用YouTube v3 API获取视频标题报错,求排查问题原因
问题描述
我写了一段Python脚本调用YouTube Data API v3获取视频信息,想测试只打印视频标题,但运行报错。脚本代码如下:
import sys, json, requests vidCode = input('\nVideo Code Here: ') url = requests.get(f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id={vidCode}&key=(not sharing the api key, lol)') text = url.text data = json.loads(text) if "kind" in data: print(f'Video URL: youtube.com/watch?v={vidCode}') print('Title: ', data['snippet.title']) else: print("The video could not be found.\n")
测试发现,改成data['etag']能正常打印,但获取标题失败。我推测标题在JSON更深层级,试了data['items']能拿到数据但内容太乱,data['items.snippet.title']也不行,请问哪里错了?
问题根源与修复方案
问题出在你对YouTube Data API返回的JSON结构理解有误:
- 接口返回的
snippet并不是直接在根字典下,而是嵌套在items数组的第一个元素里(因为API支持一次查询多个视频ID,所以items是数组类型) - Python里不能像
data['items.snippet.title']这样用.访问嵌套字典,而且items是数组,必须先取具体元素再访问字典键
修正后的代码
import sys, json, requests vidCode = input('\nVideo Code Here: ') url = requests.get(f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id={vidCode}&key=(not sharing the api key, lol)') text = url.text data = json.loads(text) # 检查是否有返回的视频条目,比判断根节点的kind更准确 if data.get('items'): # 取第一个(也是当前查询的唯一一个)视频条目 video_data = data['items'][0] print(f'Video URL: youtube.com/watch?v={vidCode}') # 逐层访问嵌套的字典键 print('Title: ', video_data['snippet']['title']) else: print("The video could not be found.\n")
核心修改说明
- 判断逻辑优化:用
data.get('items')替代"kind" in data,因为即使查询失败,根节点也可能存在kind字段,检查items是否非空才能准确判断是否拿到有效视频数据 - 正确的嵌套访问方式:先通过
data['items'][0]获取单个视频的完整数据字典,再用video_data['snippet']['title']逐层访问标题,这是Python字典嵌套访问的标准写法 - 避免索引错误:先判断
items是否存在,防止视频ID无效时触发数组索引越界错误
内容的提问来源于stack exchange,提问作者Korozin
相关产品推荐
相关产品推荐

