如何使用BeautifulSoup提取span标签中的YouTube嵌入链接?
错误原因
你原有代码的核心问题是误用了BeautifulSoup的find方法:vids[i]是Tag类型对象,调用它的find()方法是用于查找子标签,不是字符串内容匹配,所以判断逻辑完全失效,才会返回所有span标签。
实现思路
你的HTML结构里已经有专用的标记属性,不需要做模糊字符串匹配,直接通过属性筛选即可:
- 外层span的
data-s9e-mediaembed属性值为youtube,可以直接定位到所有包含YouTube嵌入的块 - 内层span的
data-s9e-mediaembed-iframe属性是JSON格式数组,倒数第一个元素就是目标YouTube嵌入链接
完整实现代码
import requests from bs4 import BeautifulSoup import json import re # 替换为你的目标页面地址 target_url = "xxx" res = requests.get(target_url) res.encoding = res.apparent_encoding soup = BeautifulSoup(res.text, "html.parser") video_urls = [] # 直接筛选YouTube专属span标签 youtube_blocks = soup.find_all("span", attrs={"data-s9e-mediaembed": "youtube"}) for block in youtube_blocks: # 提取存iframe属性的内层span iframe_span = block.find("span", attrs={"data-s9e-mediaembed-iframe": True}) if not iframe_span: continue attr_content = iframe_span["data-s9e-mediaembed-iframe"] # 优先用JSON解析提取链接 try: attr_list = json.loads(attr_content) video_urls.append(attr_list[-1]) # 解析失败时用正则兜底匹配 except json.JSONDecodeError: url_match = re.search(r"https://www\.youtube\.com/embed/[a-zA-Z0-9_-]+", attr_content) if url_match: video_urls.append(url_match.group()) # 输出所有提取到的YouTube链接 for url in video_urls: print(url)
方案优势
- 直接通过属性精准匹配目标标签,不会误判无关span,匹配效率远高于全量遍历
- 双提取逻辑兼容格式异常场景,提取成功率更高
- 直接得到可用的YouTube嵌入链接,无需额外处理
内容的提问来源于stack exchange,提问作者EddyW
相关产品推荐
相关产品推荐

