使用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
相关产品推荐
相关产品推荐

