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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:37:34