如何利用Python抓取并解析SVG格式的网页动态趋势图表数据?

千枫酱_1332

千枫酱_1332

2026-06-15

547人浏览

原创

svg元素不响应常规html解析器,是因为其由javascript动态渲染,原始html中仅含空容器;需用playwright获取渲染后dom或直接调用数据接口。

如何利用python抓取并解析svg格式的网页动态趋势图表数据?

SVG元素不响应常规HTML解析器的常见原因

直接用 requests + BeautifulSoup 抓取网页后找不到 <svg></svg> 内部的 <path></path> 或 <rect></rect>,大概率是因为这些图表由 JavaScript 动态渲染。服务器返回的原始 HTML 里可能只有空容器(如 <div id="chart"></div>),<svg></svg> 树是在浏览器中执行 JS 后才插入的。

验证方法:用浏览器「禁用 JS」后刷新页面,若图表消失或只剩骨架,就确认是动态生成。

  • 别在服务端直接解析返回的 HTML 字符串——它不含真实 SVG 结构
  • 避免对 response.text 直接丢给 BeautifulSoup(features="lxml") 就以为能提取坐标数据
  • 注意部分站点用 canvas 替代 SVG,此时走 DOM 解析路线完全失效

用Playwright获取真实渲染后的SVG DOM结构

Playwright 能启动真实浏览器上下文,等待图表渲染完成后再提取 DOM,比 Selenium 更轻量、更稳定。关键不是“截图”,而是拿到可遍历的 SVG 元素树。

示例步骤:

testing-python
testing-python

使用pytest编写和评估有效的Python测试。适用于编写测试、审查测试代码、调试测试失败或提高测试覆盖率。

下载
  • 启动 Chromium 并设置足够长的等待(比如 page.wait_for_selector("svg", timeout=10000))
  • 用 page.content() 获取完整 HTML,再用 BeautifulSoup 解析——此时 <svg></svg> 已存在且含子元素
  • 若图表使用 transform 或 viewBox 缩放,需先读取这些属性再换算原始坐标值
  • 注意部分库(如 Chart.js)会把数据编码进 <path d="..."></path> 的 d 属性,需用 svg.path 或正则提取贝塞尔曲线控制点

简单提取所有折线坐标点的示意代码:

from bs4 import BeautifulSoup
svg_html = page.content()
soup = BeautifulSoup(svg_html, "lxml")
paths = soup.select("svg path[stroke][fill='none']")  # 常见趋势线选择器
for p in paths:
    d_attr = p.get("d", "")
    if "L" in d_attr or "C" in d_attr:
        print(d_attr)  # 后续可用 svgpathtools 解析为点序列

从字符串还原原始数据点的难点

<path d></path> 是 SVG 绘图指令集合,不是原始数值映射。同一组业务数据,不同图表库生成的 d 字符串差异极大:D3 可能用 M x1 y1 L x2 y2 ...,ECharts 可能压缩成贝塞尔曲线,甚至添加动画偏移。

  • 不要假设 d 中的数字就是原始 Y 值——它们是像素坐标,需结合 <svg></svg> 的 width/height、viewBox 和坐标轴刻度反推
  • Y 轴通常“向下为正”,而业务数据是“向上增长”,必须做 y = height - y 翻转
  • 若图表有平滑插值(如 curve: 'monotoneX'),<path></path> 中的点数远大于原始数据点数,需采样或拟合
  • 推荐用 svgpathtools.parse_path(d_str) 得到路径对象,再调用 point(t) 在 [0,1] 区间均匀采样,比手写正则可靠得多

绕过前端渲染:检查Network面板找原始API接口

多数动态 SVG 图表背后都有独立的数据接口,返回 JSON 或 CSV。打开浏览器开发者工具 → Network → 切换到 XHR/Fetch,筛选关键词如 chart、data、metric、timeseries,往往比解析 SVG 快十倍且零误差。

  • 注意请求头中的 Authorization 或 X-Requested-With,Python 请求时需复现
  • 有些接口带签名(如 sign=xxx),需逆向 JS 找加密逻辑,此时 Playwright 的 page.evaluate() 可直接调用页面内函数生成签名
  • 若接口返回的是加密或混淆字段(如 "v": [1024, 2056, ...]),优先查页面 JS 中的解码函数(常位于 utils.js 或内联 <script></script>)

真正难的从来不是“怎么解析 SVG”,而是判断“有没有更干净的数据出口”。多数情况下,花 2 分钟翻 Network,比花 2 小时写 SVG 坐标反推逻辑更值得。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1691

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4244

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24617

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3007

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3027

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2343

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程