Python YouTube音频下载脚本报错:AttributeError: 'NoneType' object has no attribute 'download'
解决YouTube音频下载脚本中的AttributeError问题
嘿,我来帮你搞定这个头疼的问题!你碰到的AttributeError: 'NoneType' object has no attribute 'download',核心原因很明确——你的代码里yt_streams最后变成了None,也就是按照你设置的筛选条件,根本没找到符合要求的音频流。
问题出在哪?
- 你用了
order_by('resolution')来排序音频流,但音频流根本没有resolution(分辨率)属性!这个排序逻辑完全不适用,会导致筛选后的结果混乱,最后找不到可用的流。 - 你指定的
extension="mp3"可能不是该视频的原生音频格式,YouTube的原生音频流大多是m4a格式,mp3通常是转码后的,不是所有视频都能直接找到mp3的流。 - 加上
adaptive=True的限制,可能会过滤掉一些非自适应的音频流,进一步缩小了可选范围。
修正后的代码
def __downloader(self, link, save_path="", save_name="", extension="mp3"): yt = YouTube(link) # 按音频比特率(abr)排序,这才是衡量音频质量的正确指标 yt_streams = yt.streams.filter(only_audio=True, file_extension=extension).order_by('abr').desc().first() # 如果找不到指定格式的流, fallback到YouTube原生的m4a格式 if not yt_streams: yt_streams = yt.streams.filter(only_audio=True, file_extension='m4a').order_by('abr').desc().first() # 自动调整文件名后缀(如果用户指定了mp3但只能下载m4a) if save_name and extension == "mp3": save_name = save_name.rsplit('.', 1)[0] + ".m4a" if yt_streams: yt_streams.download(output_path=save_path, filename=save_name) else: # 抛出明确错误,方便调试 raise ValueError("无法找到该视频的可用音频流,请检查视频是否可下载或格式是否支持") return
关键修改说明
- 把
order_by('resolution')改成order_by('abr'):abr是音频比特率,数值越高音质越好,这才是音频流正确的排序依据。 - 增加了fallback逻辑:如果指定的格式(比如mp3)找不到,自动切换到原生的m4a格式,避免返回
None。 - 增加了错误判断:如果最终还是找不到任何音频流,抛出明确的错误信息,帮你快速定位问题。
额外注意事项
- 确保你的
pytube库是最新版本:旧版本可能存在YouTube API兼容问题,执行pip install --upgrade pytube更新一下。 - 如果一定要mp3格式:可以先下载m4a,再用
ffmpeg转码。比如在脚本里调用subprocess执行转换命令:import subprocess # 下载完成后转换 subprocess.run(["ffmpeg", "-i", "input.m4a", "output.mp3"]) - 部分视频可能受版权限制无法下载:这时候即使代码正确,也会找不到流,需要确认视频的可下载权限。
内容的提问来源于stack exchange,提问作者giovanni caiazzo




