You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:43:14