pytube通过input()获取播放列表URL报KeyError:'list'错误
问题根因
报错核心原因是input()函数用法错误:input()括号内传入的字符串是控制台展示的提示文本,不会作为默认输入值。你把示例播放列表链接写在input()参数位置,运行时直接按回车,实际赋值给url变量的是空字符串。pytube解析空值时找不到URL查询参数中的list字段,直接抛出KeyError: 'list'。
修复后可直接运行的代码
import re from pytube.contrib.playlist import Playlist from pytube import YouTube from pytube.cli import on_progress # 预设示例播放列表链接 DEFAULT_PLAYLIST_URL = "https://youtube.com/playlist?list=PLVxmNUcoG69uwwG59UVUyJ9SoLRHE78kp" # 明确提示用户操作,回车自动使用示例链接 input_content = input(f"请输入YouTube播放列表链接,直接回车将使用示例测试链接:").strip() url = input_content if input_content else DEFAULT_PLAYLIST_URL # 基础合法性校验 if "list=" not in url: print("输入错误:链接不是有效的YouTube播放列表地址,需包含list参数") exit(1) try: playlist = Playlist(url) total = len(playlist.video_urls) print(f"获取播放列表成功,共{total}个视频") except Exception as e: print(f"获取播放列表失败:{str(e)},请检查网络连接、链接是否为公开播放列表") exit(1) # 清洗文件名,替换系统不支持的特殊字符 def clean_filename(name): return re.sub(r'[\\/*?:"<>|]', "_", name) for idx, video_url in enumerate(playlist.video_urls, 1): try: yt = YouTube(video_url, on_progress_callback=on_progress) # 获取音视频合并的最高分辨率流 stream = yt.streams.get_highest_resolution() safe_title = clean_filename(yt.title) print(f"\n[{idx}/{total}] 正在下载:{safe_title}") stream.download(filename=f"{safe_title}.mp4") print(f"[{idx}/{total}] 下载完成:{safe_title}") except Exception as e: print(f"\n[{idx}/{total}] 视频下载失败,已跳过:{str(e)}") continue
其他常见问题排查方向
- 网络问题:pytube不会自动读取系统代理配置,运行脚本前需要确保Python进程可以正常访问YouTube,否则会出现连接超时、页面内容拉取失败的问题。
- 版本问题:YouTube会不定期调整前端页面结构,如遇解析类报错,先执行
pip install --upgrade pytube升级到最新官方版本。 - 权限问题:仅自己可见、会员专属、地区限制的播放列表/视频,pytube无权限拉取内容,会触发解析错误。
- 分辨率问题:
get_highest_resolution()仅能返回音视频合并的渐进式流,最高分辨率通常为720p;如果需要1080p及以上清晰度,需要单独下载分离的视频流、音频流,再通过ffmpeg合并。
内容的提问来源于stack exchange,提问作者MrLecker
相关产品推荐
相关产品推荐

