Python Selenium爬虫如何自动下载网页内嵌无src的SVG?
内嵌动态SVG自动化下载实现方案
核心逻辑
内嵌在DOM中的动态SVG没有独立外链,本质是直接嵌入页面文档树的<svg>节点,不需要通过requests发请求拉取资源,直接从浏览器渲染完成的DOM中提取完整节点源码,就能得到可独立打开、保留全部动态效果的标准SVG文件。
适配思路
在你原有悬停触发、APNG资源下载的逻辑基础上新增资源类型判断分支,完全不改动原有APNG的处理流程:
- 悬停触发对应元素后,同时等待两类媒体元素(带src的img标签、内嵌svg标签)任意一种加载完成
- 检测当前显示的元素是否为带有效src的img标签:如果是,走原有APNG下载流程
- 如果检测到当前显示的是内嵌svg节点,直接通过Selenium执行JS提取该节点的完整HTML源码,写入.svg格式文件即可
适配后的代码片段
# 保留原有悬停触发逻辑 ActionChains(driver).move_to_element(item).perform() # 等待任意目标媒体元素加载完成 wait.until( lambda d: d.find_elements(By.ID, "img") or d.find_elements(By.TAG_NAME, "svg") ) # 原有APNG资源处理逻辑 img_nodes = driver.find_elements(By.ID, "img") if img_nodes and img_nodes[0].is_displayed(): img_src = img_nodes[0].get_attribute("src") img_request = requests.get(img_src) if img_request.ok: with open(f"{item.text}.apng.png", "wb") as imgfile: print(f"Downloading {item.text}") imgfile.write(img_request.content) else: print("Request failed.") input("Press any key to exit") exit() # 新增的内嵌动态SVG处理逻辑 else: # 定位当前可见的SVG节点 visible_svg = wait.until(ec.visibility_of_element_located((By.TAG_NAME, "svg"))) # 提取完整SVG序列化内容,自动保留所有内嵌动画、图形属性 svg_full_content = driver.execute_script("return arguments[0].outerHTML;", visible_svg) # 以UTF-8编码写入.svg文件,可直接被浏览器、图片查看器打开 with open(f"{item.text}.svg", "w", encoding="utf-8") as svgfile: print(f"Downloading {item.text}") svgfile.write(svg_full_content)
实际适配效果
- 提取的SVG源码自带完整的命名空间属性,以及
<animate>、<animateTransform>等动态标签的全部配置,和页面悬停时看到的动态效果完全一致,不会出现动画丢失、图形变形的问题 - 整个流程全程无人工介入,完全适配批量下载的自动化需求,不需要依赖svg-grabber这类手动操作的浏览器插件
- 针对目标站点的页面结构,悬停后加载的SVG节点无外部资源依赖,提取的内容可以独立运行,不会出现资源路径失效的问题
内容的提问来源于stack exchange,提问作者541daw35d
相关产品推荐
相关产品推荐

