PyTube下载视频遇RegexMatchError:如何修改cypher.py的get_transform_object?
修复PyTube的RegexMatchError(get_transform_object)问题
直接定位到PyTube安装目录下的cypher.py文件,找到get_transform_object方法,通过修改正则匹配规则解决报错:
原问题核心代码
原方法中的正则匹配逻辑通常是:
pattern = r"var for={(.*?)};" match = re.search(pattern, js) if not match: raise RegexMatchError(caller="get_transform_object", pattern=pattern)
具体修改方案
方案1:适配空格变化的正则
把原正则替换为:
pattern = r"var for\s*=\s*{(.*?)};"
方案2:更宽松的匹配规则(适配最新YouTube JS结构)
如果方案1无效,改用更宽泛的正则:
pattern = r"for\s*=\s*({.*?});"
或者更精准的版本:
pattern = r"var\s+for\s*=\s*({.*?});"
修改后的完整方法示例
为了提升兼容性,可以给方法增加双重匹配逻辑:
def get_transform_object(js: str) -> Dict[str, Any]: # 优先尝试精准匹配 pattern = r"var\s+for\s*=\s*({.*?});" match = re.search(pattern, js, re.DOTALL) if not match: # 失败则尝试宽松匹配 pattern = r"for\s*=\s*({.*?});" match = re.search(pattern, js, re.DOTALL) if not match: raise RegexMatchError(caller="get_transform_object", pattern=pattern) transform_obj_str = match.group(1) # 转换JS对象为Python字典 transform_obj_str = transform_obj_str.replace(":", ": ").replace(",", ", ") try: return ast.literal_eval(transform_obj_str) except (SyntaxError, ValueError): # 解析失败时手动处理键值对 transform_obj = {} pairs = re.findall(r'"([^"]+)":\s*([^,}]+)', transform_obj_str) for key, value in pairs: transform_obj[key] = value.strip().strip('"') return transform_obj
额外注意事项
- 修改前务必备份
cypher.py文件,防止后续出现异常 - 若PyTube版本更新,可能需要重新修改该方法,建议优先等待官方修复版本
- 报错仍未解决时,可以尝试清除PyTube缓存(默认路径为
~/.pytube/)
内容的提问来源于stack exchange,提问作者Hajo Brandt
相关产品推荐
相关产品推荐

