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

正则表达式提取指定短语间URL失败,求修正方案

解决Python提取Twitch Clip 1080P源URL的问题

我来帮你搞定这个问题!你的正则表达式写得有点复杂,而且没精准定位到目标内容,咱们换两种更可靠的方式来实现需求:

方案一:简化正则表达式

我们可以直接精准匹配"quality":"1080","source":"后面的URL内容,直到下一个双引号为止,逻辑简单且不容易出错:

import re
from bs4 import BeautifulSoup

dt = """ <body> <script>jQuery(window).load(function () { setTimeout(function(){s }, 1000);quality_options: [{"quality":"1080","source":"https://clips-media-assets.twitch.tv/178569498.mp4","frame_rate":60},{"quality":"720","source":"https://clips-media-assets.twitch.tv/AT-178569498-1280x720.mp4","frame_rate":60},{"quality":"480","source":"https://clips-media-assets.twitch.tv/AT-178569498-854x480.mp4","frame_rate":30},{"quality":"360","source":"https://clips-media-assets.twitch.tv/AT-178569498-640x360.mp4","frame_rate":30}] });</script> </body> [download] 28.2x of 57.90MiB at 1.54MiB/s ETA 00:26 """

# 简化后的正则:精准定位1080P对应的source字段
pattern = re.compile(r'"quality":"1080","source":"(.*?)"')

clipHTML = BeautifulSoup(dt, "html.parser")
scripts = clipHTML.findAll('script')

for script in scripts:
    if script.text:
        match = pattern.search(script.text)
        if match:
            source_url = match.group(1)
            print("提取到的1080P源URL:", source_url)

这个正则的逻辑很直观:

  • "quality":"1080","source":" 锁定目标字段的前缀
  • (.*?) 用非贪婪匹配捕获到下一个双引号前的所有内容,也就是我们需要的URL

方案二:解析JSON结构(更推荐)

脚本里的quality_options后面跟着的是标准JSON数组,直接解析JSON比正则更稳定——比如遇到URL里有特殊字符时,正则可能失效,但JSON解析不会:

import re
import json
from bs4 import BeautifulSoup

dt = """ <body> <script>jQuery(window).load(function () { setTimeout(function(){s }, 1000);quality_options: [{"quality":"1080","source":"https://clips-media-assets.twitch.tv/178569498.mp4","frame_rate":60},{"quality":"720","source":"https://clips-media-assets.twitch.tv/AT-178569498-1280x720.mp4","frame_rate":60},{"quality":"480","source":"https://clips-media-assets.twitch.tv/AT-178569498-854x480.mp4","frame_rate":30},{"quality":"360","source":"https://clips-media-assets.twitch.tv/AT-178569498-640x360.mp4","frame_rate":30}] });</script> </body> [download] 28.2x of 57.90MiB at 1.54MiB/s ETA 00:26 """

clipHTML = BeautifulSoup(dt, "html.parser")
scripts = clipHTML.findAll('script')

for script in scripts:
    if script.text:
        # 先提取quality_options后的JSON数组片段
        json_match = re.search(r'quality_options:\s*(\[.*?\])', script.text, re.DOTALL)
        if json_match:
            json_str = json_match.group(1)
            # 解析JSON为Python列表
            quality_list = json.loads(json_str)
            # 遍历找到1080P对应的项
            for item in quality_list:
                if item.get("quality") == "1080":
                    print("提取到的1080P源URL:", item.get("source"))
                    break

这种方法的优势很明显:

  • 完全遵循结构化数据的解析规则,兼容性更强
  • 后续如果需要提取其他清晰度的URL,直接修改判断条件即可,扩展性拉满

你可以试试上面两种方案,第二种更适合这类包含结构化数据的场景哦!

内容的提问来源于stack exchange,提问作者user3121369

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:08