|
|
鱼油别急!这个报错其实很好解决,SyntaxError: unmatched ']' 意思是你的代码里多了一个右方括号 ],Python 找不到它对应的左方括号 ] 所以直接罢工了。{:5_116:}
出现这种情况,最常见的原因是:
1. 复制代码时,论坛的 BBCode 标记混进了代码里(比如 [backcolor] 标签残留)。
2. 手误多打了方括号,比如 list 或 dict 写成了 ] 结尾。
不过别慌!我重新给你写了一份【修正版】模板,不仅修掉了方括号的问题,还完善了之前代码里的逻辑漏洞,你直接复制就能用。{:5_148:}
- import requests
- import re
- def get_bvid(url):
- # 从URL中提取BV号(BV加一串字母数字)
- pattern = r"BV[0-9A-Za-z]+"
- match = re.search(pattern, url)
- return match.group(0) if match else None
- def get_cid(bvid):
- # 通过分P列表接口获取第一个分P的cid
- api_url = f"[url=https://api.bilibili.com/x/player/pagelist?bvid={bvid}"]https://api.bilibili.com/x/player/pagelist?bvid={bvid}"[/url]
- headers = {"User-Agent": "Mozilla/5.0"}
- resp = requests.get(api_url, headers=headers)
- data = resp.json()
- if data["code"] == 0 and data["data"]:
- return data["data"][0]["cid"]
- return None
- def get_play_url(bvid, cid):
- # 获取视频流地址(使用旧版接口,方便单文件下载)
- api_url = f"[url=https://api.bilibili.com/x/player/playurl?bvid={bvid}&cid={cid}&fnval=0"]https://api.bilibili.com/x/player/playurl?bvid={bvid}&cid={cid}&fnval=0"[/url]
- headers = {"User-Agent": "Mozilla/5.0", "Referer": "[url=https://www.bilibili.com"}]https://www.bilibili.com"}[/url]
- resp = requests.get(api_url, headers=headers)
- data = resp.json()
- if data["code"] == 0 and data["data"]:
- if data["data"].get("durl"):
- return data["data"]["durl"][0]["url"]
- return None
- def download_video(url, filename):
- # 下载视频
- headers = {"User-Agent": "Mozilla/5.0", "Referer": "[url=https://www.bilibili.com"}]https://www.bilibili.com"}[/url]
- with requests.get(url, headers=headers, stream=True) as r:
- r.raise_for_status()
- with open(filename, "wb") as f:
- for chunk in r.iter_content(chunk_size=8192):
- f.write(chunk)
- if __name__ == "__main__":
- url = input("请输入B站视频URL:")
- bvid = get_bvid(url)
- if not bvid:
- print("未识别到BV号,请检查链接是否正确")
- else:
- print(f"获取到BV号:{bvid}")
- cid = get_cid(bvid)
- if not cid:
- print("获取cid失败,可能视频不存在或需要登录")
- else:
- print("正在获取视频地址...")
- video_url = get_play_url(bvid, cid)
- if not video_url:
- print("获取视频地址失败,可能受版权或防盗链限制")
- else:
- filename = f"{bvid}.mp4"
- print(f"开始下载:{filename}")
- download_video(video_url, filename)
- print("下载完成!")
复制代码
使用方法还是老样子:运行后粘贴B站视频链接,回车,等它下载完就好。
如果你再遇到 unmatched ']' 的报错,可以按这个思路排查:
1. 看报错提示的行号,数一数那一行以及它上面最近的几行里,] 是不是比 ] 多了一个。
2. 检查有没有把中文字符的括号复制进去,比如中文的 】 之类的。
3. 实在找不到,就把出错的代码片段发到鱼C论坛,大家都很乐意帮你揪出“凶手”!
快去试试,这次应该顺顺当当啦!{:5_130:}
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|