如何通过纯Python方法读取Highcharts调用setExtremes后的图表数据?
解决Highcharts调用setExtremes后获取过滤数据的Python方法
你的代码里有两个关键问题导致拿不到想要的数据:一是JavaScript代码的语法错误,二是误解了Highcharts数据存储的逻辑——options.data是图表的原始全量数据,调用setExtremes只是控制图表显示范围,不会修改原始数据,所以得换个方式取过滤后的显示数据。
我给你修正并优化后的代码,一步步来:
第一步:修正JavaScript执行逻辑
你之前把三个JS字符串直接拼接在一起,语法上就有问题,而且setExtremes是一个执行方法,不会返回数据,必须分开执行设置和获取操作。
第二步:获取正确的过滤后数据
Highcharts中,当前显示在图表上的点数据存在series[0].points数组里,而不是options.data。我们可以用JS的map方法把每个点的关键信息(比如x轴时间、y轴数值)提取出来,避免返回复杂的对象导致序列化问题。
完整代码如下:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time capabilities = webdriver.DesiredCapabilities().FIREFOX capabilities["marionette"] = True driver = webdriver.Firefox(capabilities=capabilities, executable_path=gecko_binary_path) driver.get(website) # 用WebDriverWait替代time.sleep,更可靠地等待图表加载完成 WebDriverWait(driver, 10).until( lambda d: d.execute_script('return window.Highcharts.charts[0] !== undefined') ) # 调用setExtremes设置时间范围(注意月份是从0开始的,1月对应0) driver.execute_script(""" const chart = window.Highcharts.charts[0]; chart.xAxis[0].setExtremes(Date.UTC(2017, 0, 7), Date.UTC(2017, 0, 8)); """) # 等待图表更新完成(可选,根据图表加载速度调整) time.sleep(1) # 获取过滤后的点数据,提取需要的字段 filtered_data = driver.execute_script(""" const chart = window.Highcharts.charts[0]; return chart.series[0].points.map(point => ({ x: point.x, // 时间戳(UTC) y: point.y, // 对应数值 category: point.category // 如果是分类轴可以取这个,按需选择 })); """) # 处理并打印数据 for item in filtered_data: print(item) driver.quit()
关键说明:
WebDriverWait比time.sleep更灵活,会在图表加载完成后立即执行后续代码,不用固定等待5秒series[0].points是当前图表渲染的实际数据,已经经过setExtremes的范围过滤- 用
map转换数据格式,是因为直接返回Highcharts的Point对象可能会有序列化问题,提取需要的字段更稳妥
内容的提问来源于stack exchange,提问作者Black
相关产品推荐
相关产品推荐

