如何用Selenium和Python提取SVG标签内g元素中的文本?
解决MSCI ESG气候工具中SVG内g标签文本提取问题
问题场景
在MSCI的ESG气候搜索工具页面完成公司搜索、展开最后一个下拉菜单后,需要提取指定SVG标签下g标签内的文本字段,但原代码未成功提取。
修正方案
1. 处理动态加载问题
页面中的Highcharts图表是动态渲染的,直接查找元素会因为元素未加载完成导致失败,必须使用显式等待确保元素已存在。
2. 优化定位逻辑
原XPATH定位可简化,同时确保遍历所有目标text元素(如果存在多个),避免只取第一个元素的文本。
修正后的代码示例
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待目标SVG元素加载完成,超时时间10秒 wait = WebDriverWait(driver, 10) target_svg = wait.until( EC.presence_of_element_located( (By.XPATH, "//svg[@class='highcharts-root']") ) ) # 定位g标签下的所有text元素 text_items = target_svg.find_elements( By.XPATH, ".//g[@class='highcharts-axis-labels highcharts-xaxis-labels']//text" ) # 提取并打印所有文本 for item in text_items: print(item.text)
额外注意事项
- 确认g标签的class属性完全匹配:页面可能存在多个同类型的g标签,若提取结果不符合预期,可结合父元素或其他属性缩小定位范围
- 若仍存在命名空间问题,可将XPATH中的标签名替换为命名空间写法,比如:
//*[local-name()='svg' and @class='highcharts-root']//*[local-name()='g' and @class='highcharts-axis-labels highcharts-xaxis-labels']//*[local-name()='text']
内容的提问来源于stack exchange,提问作者vossi
相关产品推荐
相关产品推荐

