Python BeautifulSoup如何爬取多层div嵌套下tspan的特定值
基于BeautifulSoup提取SVG内tspan数值的实现方案
问题描述
使用Python BeautifulSoup库开展网页爬取工作,已完成账号登录、基础页面爬取逻辑开发,当前遇到提取障碍:需要从多层div嵌套的SVG结构底部的tspan标签中提取指定值。
现有初始代码仅实现了class为tablebox的div、id为exoTooltip的元素、class为exoTooltip undefined的g标签查找,无法定位到目标tspan节点,初始代码如下:
soup = bs(s.get(URL).text, 'html.parser') divTag = soup.find_all("div", {"class": "tablebox"}) results = soup.find(id="exoTooltip") elements = results.find_all("g", class_="exoTooltip undefined")
现有代码缺陷
- 冗余查找外层tablebox div,id为exoTooltip的元素是全局唯一的,不需要依赖外层div定位
- 查找路径终止于g标签层,没有继续向下穿透SVG嵌套结构定位tspan节点
- 硬编码匹配g标签的class为
exoTooltip undefined,动态页面的class顺序、临时class容易发生变化,会导致匹配失效 - 逐层硬编码标签路径的写法容错性差,任意一层嵌套变动就会导致匹配失败
修正后代码
直接以唯一id的exoTooltip容器为起点,全局查找内部所有tspan节点,无需手动逐层写嵌套匹配逻辑:
from bs4 import BeautifulSoup # 复用你已经完成登录的会话对象s即可 soup = BeautifulSoup(s.get(URL).text, 'html.parser') # 定位唯一的tooltip容器 tooltip_wrap = soup.find(id="exoTooltip") if tooltip_wrap: # 直接查找容器下所有tspan标签,自动穿透div、svg、g等多层嵌套 all_tspans = tooltip_wrap.find_all("tspan") # 遍历提取tspan内的文本值 for item in all_tspans: val = item.get_text(strip=True) # 按需过滤你需要的目标值即可 print(val) else: # 排查点:如果找不到容器,先确认请求返回的源码是否完整 # 若源码中无对应节点,说明内容是前端JS动态渲染的,需要先用selenium/playwright等工具拿到渲染完成的页面源码再解析 print("未找到目标容器,请检查页面源码加载情况")
注意事项
不要硬编码多层标签的查找路径,只要定位到最外层稳定的唯一标识节点,直接向下查找目标标签即可,适配性更强。如果遇到动态渲染的SVG内容,不要直接用requests请求的源码解析,必须等页面JS执行完成后再获取源码。
内容的提问来源于stack exchange,提问作者friedfrog
相关产品推荐
相关产品推荐

