如何用Python Selenium获取指定币种日期的K线图并截图用于Discord加密货币机器人
问题原因及解决办法
你遇到的元素找不到问题核心原因有三点:
- 页面异步加载未完成就执行查找:CoinGecko的K线图表是后渲染的SVG内容,页面加载完成不代表图表元素已经渲染完毕
- SVG元素命名空间限制:直接用
By.TAG_NAME定位SVG内部的<text>标签,Selenium无法正常识别 - 定位逻辑冗余:时间范围选择完全不需要修改SVG内的text元素,CoinGecko页面自带现成的7天筛选按钮,直接点击即可生成目标周期K线,操作成本远低于修改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 from time import sleep driver = webdriver.Chrome() driver.get("https://www.coingecko.com/en/coins/bitcoin") driver.maximize_window() try: # 等待7天筛选按钮可点击,直接切换时间范围 wait = WebDriverWait(driver, 15) seven_day_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'price-chart') and text()='7d']"))) seven_day_btn.click() # 等待图表重新渲染完成 sleep(2) # 可选:只截取图表区域,比整页截图更适合发Discord chart_ele = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[data-target='price-chart.chartContainer']"))) chart_ele.screenshot('chart.png') except Exception as e: print(f'操作失败:{str(e)}') finally: driver.quit()
补充说明
如果确实需要操作SVG内的text元素,需要使用适配命名空间的XPath写法,示例定位格式为//*[name()='svg']//*[name()='text' and contains(text(),'匹配文本')]
内容的提问来源于stack exchange,提问作者Ged0jzn4
相关产品推荐
相关产品推荐

