You need to enable JavaScript to run this app. 如何使用BeautifulSoup提取span标签中的YouTube嵌入链接?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 03:15:05