正则表达式提取指定短语间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
相关产品推荐
相关产品推荐

