如何使用Python提取class属性动态变化的div标签中的数据
最优解决方案
你原来通过固定的data-section-tag属性定位父容器的思路是对的,完全不需要依赖动态生成的class值,有两种比字符串切割稳定得多的提取方式:
方案1:遍历父容器下的指标节点提取键值对
这类指标卡片的内部结构都是每个指标对应独立的子节点,你可以直接遍历所有子节点把指标名和对应值整理成字典,后续取值直接查字典即可,不会受指标顺序调整、文本格式变动的影响。
示例代码:
from bs4 import BeautifulSoup as bs import requests s = requests.Session() response = s.get('https://www.tickertape.in/etfs/kotak-nifty-50-etf-KOTK') soup = bs(response.text, 'html.parser') # 还是用固定的data属性定位父容器 metrics_container = soup.find("div", {"data-section-tag": "key-metrics"}) metrics_dict = {} # 遍历容器下所有直接子节点,过滤空节点 for item in metrics_container.children: if item.name == 'div': # 每个指标项都是div节点 # 清理文本里的换行、多余空格 text = item.get_text(strip=True).replace('\n', ' ') # 拆分指标名和值,比如"AUM ₹1,234 Cr"拆成键AUM,值₹1,234 Cr for key in ['AUM', 'Expense Ratio', 'Tracking Error']: if text.startswith(key): metrics_dict[key] = text[len(key):].strip() break # 直接从字典取值即可 print("The AUM value", metrics_dict.get('AUM', '')) print("The Expense ratio", metrics_dict.get('Expense Ratio', '')) print("The Tracking Error", metrics_dict.get('Tracking Error', '')) s.close()
方案2:提取页面内嵌的初始JSON数据(最稳定)
该网站是React开发的,页面加载时会把所有初始数据放在<script>标签的全局变量里,完全不需要解析HTML,直接提取JSON解析取值即可,不受前端渲染结构、class值、指标展示顺序的任何影响。
示例代码:
import requests import json import re s = requests.Session() response = s.get('https://www.tickertape.in/etfs/kotak-nifty-50-etf-KOTK') # 正则匹配初始数据 raw_data = re.search(r'window\.__INITIAL_STATE__ = (.*?);</script>', response.text).group(1) json_data = json.loads(raw_data) # 直接从JSON结构里取对应字段即可,路径可以自己在浏览器控制台打印__INITIAL_STATE__查找 aum = json_data['etf']['detail']['aum'] expense_ratio = json_data['etf']['detail']['expenseRatio'] tracking_error = json_data['etf']['detail']['trackingError'] print("The AUM value", f"₹{aum} Cr") print("The Expense ratio", f"{expense_ratio}%") print("The Tracking Error", f"{tracking_error}%") s.close()
方案对比
- 原字符串切割方案:只要网站调整指标顺序、新增中间指标就会完全失效,稳定性极差
- 方案1:不受动态class影响,只要指标名不变就可以正常提取,稳定性中等
- 方案2:直接取后台返回的原始数据,只要接口字段不变就不受任何前端改动影响,稳定性最高
内容的提问来源于stack exchange,提问作者Rove sprite
相关产品推荐
相关产品推荐

