在Colab中用Pytube下载含僧伽罗语标题YouTube视频失败求助
解决Google Colab中含僧伽罗语标题的YouTube视频下载失败问题
问题重现
使用Pytube下载YouTube音频时,部分僧伽罗语标题视频可成功下载,但特定视频(链接:https://www.youtube.com/watch?v=HdPK6pd6XnA)抛出错误:
OSError: [Errno 22] Invalid argument: '/content/drive/My Drive/සමාධිය අඩු වෙලා වීර්යය වැඩි කරගත්තොත් කලබලකාරී වෙනවා සමාධිය වැඩි වෙලා විර්යය අඩු වුණොත් උදාසීන වෙනවා.mp4'
原文件名清理函数未解决问题,核心原因是未处理Unicode字符规范化及Google Drive文件系统的特殊限制。
解决方案
方案1:改进Pytube的文件名处理逻辑
通过规范化Unicode字符、彻底清理非法字符,并手动指定下载文件名,解决编码兼容性问题:
!pip install pytube from google.colab import drive drive.mount('/content/drive') from pytube import YouTube import re import unicodedata def sanitize_filename(filename): # 移除文件系统禁止的特殊字符 sanitized = re.sub(r'[<>:"/\\|?*]', '_', filename) # 规范化Unicode字符,消除组合字符、隐形字符等问题 sanitized = unicodedata.normalize('NFKC', sanitized) # 限制文件名长度(Google Drive支持最大255字符) max_length = 255 if len(sanitized) > max_length: # 截断时保留.mp4后缀,避免文件名无效 sanitized = sanitized[:max_length - 4] + '.mp4' return sanitized video_url = "https://www.youtube.com/watch?v=HdPK6pd6XnA" yt = YouTube(video_url) # 清理视频标题作为文件名 clean_filename = sanitize_filename(f"{yt.title}.mp4") # 手动指定文件名下载到Drive yt.streams.filter(only_audio=True).first().download( output_path='/content/drive/My Drive', filename=clean_filename )
方案2:换用yt-dlp(推荐)
yt-dlp对非ASCII文件名、复杂视频的兼容性远优于Pytube,无需手动处理文件名即可自动兼容:
!pip install yt-dlp from google.colab import drive drive.mount('/content/drive') # 下载音频并自动处理文件名,保存到Google Drive !yt-dlp -x --audio-format mp4 -o "/content/drive/My Drive/%(title)s.%(ext)s" "https://www.youtube.com/watch?v=HdPK6pd6XnA"
如果仍遇到文件名问题,可直接用视频ID作为文件名(避免语言编码问题):
!yt-dlp -x --audio-format mp4 -o "/content/drive/My Drive/%(id)s.%(ext)s" "https://www.youtube.com/watch?v=HdPK6pd6XnA"
关键原因说明
原清理函数仅处理了基础非法字符,但僧伽罗语的Unicode字符可能包含组合字符(如带附加符号的字符),Google Drive挂载的文件系统无法正确识别这类未规范化的字符,导致Errno 22错误。使用NFKC规范化可将组合字符转换为单个标准字符,同时手动指定文件名能避免Pytube自动处理时的编码偏差。
内容的提问来源于stack exchange,提问作者madhawavish
相关产品推荐
相关产品推荐

