You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium获取晨星网iframe中股票风格权重九宫格数据报错问题

问题解决方法

核心原因

  • 点击Weight单选按钮后,SVG风格箱的数据是异步渲染的,你没有加等待就直接定位,此时元素还未加载完成
  • SVG内部元素的XPath定位规则和普通HTML元素不同,直接写标签名无法识别,需要用local-name()指定SVG标签
  • 你之前使用的绝对路径/层级选择器过于依赖页面原始结构,容错性极低

修正后完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F00000NF9P&tab=3")

# 切换到portfolio iframe
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//iframe[@id='portfolio']")))
driver.switch_to.frame(iframe)

# 点击Weight选项
weight_radio = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='radio'][value='Weight']"))
)
weight_radio.click()

# 等待SVG内的9个权重文本元素加载完成,使用SVG专属定位规则
weight_elements = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, "//*[local-name()='g' and @class='style-box-text-layer']/*[local-name()='g']/*[local-name()='text']"))
)

# 提取所有数值,顺序为:大盘价值/大盘平衡/大盘成长 -> 中盘价值/中盘平衡/中盘成长 -> 小盘价值/小盘平衡/小盘成长
weight_values = [ele.text.strip() for ele in weight_elements]
print(weight_values)

# 用完记得退出driver
driver.quit()

关键说明

  • 针对SVG元素的定位,必须用*[local-name()='标签名']的格式匹配g、text等SVG内部标签,直接写//g///text无法识别
  • 显式等待presence_of_all_elements_located会等9个文本元素全部加载完成再执行后续操作,避免异步渲染导致的元素找不到问题
  • 提取到的weight_values列表共9个元素,按行从上到下、从左到右对应风格箱的9个权重值

内容的提问来源于stack exchange,提问作者jccigh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:27:07