使用pytube下载YouTube播放列表时出现regex_search匹配错误求助
YouTube播放列表下载报错解决方案
你的问题核心是分支调用逻辑完全搞反了,同时pytube的Playlist类存在正则匹配兼容性问题,以下是具体解决步骤:
1. 修正分支调用的低级错误
看你的代码:
- 选择
1(播放列表)时,你错误调用了download_video(),把播放列表URL传给了YouTube()类——而播放列表URL里没有单个视频的11位ID,自然触发regex_search找不到匹配的错误。 - 两个分支都调用了
download_video,完全没用到你写的download_playlist函数!
先把逻辑改对:
if global_choise == '1': link = input('Enter URL of playlist >> ') resolution = input('Enter resolution(144p, 240p, 360p, 720p, 1080p...) >> ') download_playlist(link, resolution, path) # 改为调用播放列表下载函数 elif global_choise == '2': link = input('Enter URL of video >> ') resolution = input('Enter resolution(144p, 240p, 360p, 720p, 1080p...) >> ') download_video(link, resolution, path)
2. 修复Playlist的正则匹配问题
如果修正后仍报错,大概率是pytube默认的视频ID正则无法匹配某些格式的播放列表URL,手动指定正确的正则即可:
修改download_playlist函数,同时优化打印信息(别直接打印playlist.videos,会输出一堆对象):
def download_playlist(link, resolution, path): try: # 修复播放列表的视频ID正则匹配 Playlist.video_regex = r"watch\?v=([0-9A-Za-z_-]{11})" playlist = Playlist(link) # 打印直观的播放列表信息 print(f'Downloading playlist: {playlist.title} (共 {len(playlist.video_urls)} 个视频)') for video in playlist.videos: stream = video.streams.get_by_resolution(resolution) if stream: print(f'Downloading: {stream.title}') stream.download(path) else: print(f'Warning: 视频 {video.title} 没有 {resolution} 分辨率,跳过') except Exception as e: print(f'oops! Error: {e}')
3. 额外优化建议
- 确保下载路径存在:可以加一行
os.makedirs(path, exist_ok=True)(记得导入os模块),避免路径不存在导致下载失败 - 给单个视频下载也加分辨率判断,避免因指定分辨率不存在而报错
完整修正后的代码
from pytube import YouTube from pytube import Playlist import os # 替换为你的下载路径,自动创建不存在的路径 path = 'MY PATH' os.makedirs(path, exist_ok=True) def download_video(link, resolution, path): try: yt = YouTube(link, use_oauth=True, allow_oauth_cache=True) stream = yt.streams.get_by_resolution(resolution) if stream: print(f'Downloading: {stream.title}') stream.download(path) else: print(f'Warning: 视频 {yt.title} 没有 {resolution} 分辨率,跳过') except Exception as e: print(f'oops! Error: {e}') def download_playlist(link, resolution, path): try: # 修复播放列表的视频ID正则匹配 Playlist.video_regex = r"watch\?v=([0-9A-Za-z_-]{11})" playlist = Playlist(link) print(f'Downloading playlist: {playlist.title} (共 {len(playlist.video_urls)} 个视频)') for video in playlist.videos: stream = video.streams.get_by_resolution(resolution) if stream: print(f'Downloading: {stream.title}') stream.download(path) else: print(f'Warning: 视频 {video.title} 没有 {resolution} 分辨率,跳过') except Exception as e: print(f'oops! Error: {e}') global_choise = input('Hi! What do you want to download? playlist/video (1/2) >> ') if global_choise == '1': link = input('Enter URL of playlist >> ') resolution = input('Enter resolution(144p, 240p, 360p, 720p, 1080p...) >> ') download_playlist(link, resolution, path) elif global_choise == '2': link = input('Enter URL of video >> ') resolution = input('Enter resolution(144p, 240p, 360p, 720p, 1080p...) >> ') download_video(link, resolution, path)
最后检查点
- 确保输入的播放列表URL是标准格式,比如
https://www.youtube.com/playlist?list=XXXXXXXXXXXXXX - 如果遇到OAuth登录问题,可清空用户目录下的
.pytube缓存文件夹后重新尝试
内容的提问来源于stack exchange,提问作者Dima Paharski
相关产品推荐
相关产品推荐

