网易首页 > 网易号 > 正文 申请入驻

python利用lxml库剩下操作svg图片详解

0
分享至

同时查看一下 svg 内容,如下所示。

在大多数场景中,我们都用 lxml 库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。本文就来和大家聊聊具体操作方法,希望对大家有所帮助

在大多数场景中,我们都用 lxml 库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析 SVG 文件,然后使用 SVG 中的各种元素和属性来进行操作。

lxml 操作 svg 图片示例

在本篇博客的入门篇,我们首先使用一下 lxml 库解析 svg 文件,并修改它的颜色。

SVG 图片生成,可以查看 《Python 生成 svg 图片,一篇博客带你掌握 Python 与 svg 之间的操作》 这篇博客。

借用 svgwrite 库,生成一个红色背景的 svg 图片。

import svgwrite
dwg = svgwrite.Drawing('demo.svg', size=(100, 20), profile='tiny')
dwg.add(dwg.rect(insert=(0, 0), size=(100, 20), fill='red'))
phone_number = '橡皮擦'
dwg.add(dwg.text(phone_number, insert=(0, 15), fill='white', font_size=12))
dwg.save()

< ?xml version="1.0" encoding="utf-8" ?>
< svg baseProfile="tiny" height="20" version="1.2" width="100" xmlns="http://www.w3.org/2000/svg"
xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">
< defs/>
< rect fill="red" height="20" width="100" x="0" y="0"/>
< text fill="white" font-size="12" x="0" y="15">橡皮擦
< /svg>

我们需要替换的内容是 fill="white" ,将其修改为 fill="#03a9f4"。使用 lxml 读取该文件,进行颜色替换。

from lxml import etree
# 解析SVG文件
svg_file = 'demo.svg'
with open(svg_file, 'rb') as f:
svg_data = f.read()
parser = etree.XMLParser(remove_blank_text=True)
svg_tree = etree.fromstring(svg_data, parser)
# 修改颜色
for element in svg_tree.iter():
if 'fill' in element.attrib:
# 替换颜色
element.attrib['fill'] = element.attrib['fill'].replace('white', '#03a9f4')
# 保存修改后的SVG文件
with open('modified_demo.svg', 'wb') as f:
f.write(etree.tostring(svg_tree, pretty_print=True))

此时替换之后,再次查看 svg 图片源码内容,如下所示。

< svg xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="tiny" height="20" version="1.2" width="100">
< defs/>
< rect fill="red" height="20" width="100" x="0" y="0"/>
< text fill="#03a9f4" font-size="12" x="0" y="15">橡皮擦
< /svg>

重点注意 text 元素部分,发现 fill 属性的值已经被修改成最新的颜色了。

lxml 给 svg 图片添加新元素

使用 append() 函数可以给 svg 图片添加新元素,例如下述代码将添加一个矩形到图片中。

from lxml import etree
# 解析SVG文件
svg_file = 'demo.svg'
with open(svg_file, 'rb') as f:
svg_data = f.read()
parser = etree.XMLParser(remove_blank_text=True)
svg_tree = etree.fromstring(svg_data, parser)
new_element = etree.Element('rect', x='5', y='5', width='50', height='20',
svg_tree.append(new_element)
# 保存修改后的SVG文件
with open('modified_demo.svg', 'wb') as f:
f.write(etree.tostring(svg_tree, pretty_print=True))

这里矩形的定位并没有精确计算,实现的效果图如下所示。

lxml 删除 svg 图片中的元素

除新增外,还可以对 svg 中元素进行删除操作。示例代码如下所示。

from lxml import etree
# 解析SVG文件
svg_file = 'modified_demo.svg'
with open(svg_file, 'r') as f:
svg_data = f.read()
parser = etree.XMLParser(remove_blank_text=True)
svg_tree = etree.fromstring(svg_data, parser)
# 通过 xpath 查找需要删除的元素
elements_to_remove = svg_tree.xpath("//text")
print(elements_to_remove)
for element in elements_to_remove:
element.getparent().remove(element)

运行代码会发现通过 xpath 无法查找到目标元素 text,这时因为 SVG 文件中含有命名空间,导致 xpath 语法查询不到相应的元素,可以通过为 xpath 语法指定命名空间来解决这个问题。

添加命名空间之后的提取语法如下所示。

from lxml import etree
# 解析SVG文件
svg_file = 'modified_demo.svg'
svg_tree = etree.parse(svg_file)
root = svg_tree.getroot()
# 获取命名空间
ns = {'svg': root.nsmap[None]}
# 通过 xpath 查找需要删除的元素
elements_to_remove = svg_tree.xpath("//svg:text", namespaces=ns)
print(elements_to_remove)

尤其注意 xpath 部分需要使用 //svg:text 进行提取。

如果不提前生命 ns 变量,可以使用下述代码进行指定命名空间。

elements_to_remove = svg_tree.xpath("//svg:circle", namespaces={'svg': 'http://www.w3.org/2000/svg'})

有了上述基础之后,完整的 lxml 删除元素代码如下所示。

from lxml import etree
# 解析SVG文件
svg_file = 'modified_demo.svg'
svg_tree = etree.parse(svg_file)
root = svg_tree.getroot()
# 获取命名空间
ns = {'svg': root.nsmap[None]}
# 通过 xpath 查找需要删除的元素
elements_to_remove = svg_tree.xpath("//svg:text", namespaces=ns)
print(elements_to_remove)
for element in elements_to_remove:
element.getparent().remove(element)
# 保存修改后的 SVG 文件
with open('modified_demo1.svg', 'wb') as f:
f.write(etree.tostring(svg_tree, pretty_print=True))

以上就是python利用lxml库剩下操作svg图片的详细内容

  • 原文来自:https://www.jb51.net/article/273274.htm
  • 本文地址:https://www.linuxprobe.com/lxml-linux-study.html编辑:倪家兴,审核员:逄增宝
  • Linux命令大全:https://www.linuxcool.com/
  • Linux系统大全:https://www.linuxdown.com/
  • 红帽认证RHCE考试心得:https://www.rhce.net/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“数学天才,高数挂科?”丘成桐悔不当初:低估了家长补课的强度

“数学天才,高数挂科?”丘成桐悔不当初:低估了家长补课的强度

妍妍教育日记
2026-07-07 19:25:37
台风、暴雨、强对流天气预警:“巴威”(超强台风级)预计将于11日白天登陆或擦过台湾岛北部沿海,然后向福建中部到浙江南部沿海靠近

台风、暴雨、强对流天气预警:“巴威”(超强台风级)预计将于11日白天登陆或擦过台湾岛北部沿海,然后向福建中部到浙江南部沿海靠近

都市快报橙柿互动
2026-07-09 06:12:02
常州一商场宣布:免费停车!

常州一商场宣布:免费停车!

常州大喇叭
2026-07-09 14:31:58
94岁原中央保健局局长王敏清:50年没感冒,无三高,靠的就是这几招

94岁原中央保健局局长王敏清:50年没感冒,无三高,靠的就是这几招

新浪财经
2026-06-24 02:28:33
美的创始人何享健:坐拥2250亿财富无人继承,3个孩子均为老总

美的创始人何享健:坐拥2250亿财富无人继承,3个孩子均为老总

蜉蝣说
2026-07-02 09:48:38
彻底谈崩!中方不再口头警告,直接卡住澳洲722万吨命脉货源

彻底谈崩!中方不再口头警告,直接卡住澳洲722万吨命脉货源

潋滟晴方DAY
2026-07-08 21:20:53
成都一女子不洗手抱孙子,儿媳怒斥不卫生,儿子一拳打面中,母亲扬言要儿子坐牢,儿子却说:她活该!6年后现状曝光...

成都一女子不洗手抱孙子,儿媳怒斥不卫生,儿子一拳打面中,母亲扬言要儿子坐牢,儿子却说:她活该!6年后现状曝光...

背包旅行
2026-07-02 14:33:11
以巴冲突中一个极丑陋、极双标的流氓逻辑

以巴冲突中一个极丑陋、极双标的流氓逻辑

壹家言
2026-07-07 10:06:01
竟能同时“促发”胃癌和肠癌?北大肿瘤医院重磅研究:根除它,结直肠癌风险最多降62%!

竟能同时“促发”胃癌和肠癌?北大肿瘤医院重磅研究:根除它,结直肠癌风险最多降62%!

医药养生保健报社
2026-07-05 20:00:32
95岁香港老戏骨朱维德离世,参演过《同事三分亲》《宫心计2》等多部剧集,曾是TVB开台十名元老之一

95岁香港老戏骨朱维德离世,参演过《同事三分亲》《宫心计2》等多部剧集,曾是TVB开台十名元老之一

扬子晚报
2026-07-08 18:03:14
贝恩资本出清在铠侠持股,后者股价自IPO上涨超50倍

贝恩资本出清在铠侠持股,后者股价自IPO上涨超50倍

IT之家
2026-07-09 09:43:07
马斯克再扔王炸!SpaceX申请发射10万颗卫星 打造AI全球通信底座

马斯克再扔王炸!SpaceX申请发射10万颗卫星 打造AI全球通信底座

快科技
2026-07-08 07:36:12
致癌油风暴延烧,台民意机构通过临时动议,要求卓荣泰等人下台

致癌油风暴延烧,台民意机构通过临时动议,要求卓荣泰等人下台

海峡导报社
2026-07-08 12:59:03
俄罗斯GDP,1993年是中国的97%,2009年是中国的23.5%,2025年呢

俄罗斯GDP,1993年是中国的97%,2009年是中国的23.5%,2025年呢

混沌录
2026-06-24 22:25:07
宗馥莉街头被偶遇!卸任后瘦到认不出,600万定制劳斯莱斯抢镜

宗馥莉街头被偶遇!卸任后瘦到认不出,600万定制劳斯莱斯抢镜

今古深日报
2026-07-07 10:09:37
台风“巴威”到哪了?周六影响将达到最强,浙江、福建严阵以待

台风“巴威”到哪了?周六影响将达到最强,浙江、福建严阵以待

上游新闻
2026-07-09 13:36:04
哈梅内伊国葬不到1天,伊朗突然通告全球,要给中国一个特殊待遇

哈梅内伊国葬不到1天,伊朗突然通告全球,要给中国一个特殊待遇

军机Nova
2026-07-09 00:25:20
李小孩的“玻璃鸡蛋”最薄处仅0.1毫米,在隋朝做什么用?

李小孩的“玻璃鸡蛋”最薄处仅0.1毫米,在隋朝做什么用?

收藏大视界
2026-06-27 17:16:50
带12瓶茅台去岳父家拜年,小舅子嫌低档,我拎走后妻子打爆我电话

带12瓶茅台去岳父家拜年,小舅子嫌低档,我拎走后妻子打爆我电话

千秋文化
2026-07-03 19:25:04
特朗普:美伊谅解备忘录“已终结”

特朗普:美伊谅解备忘录“已终结”

政知新媒体
2026-07-08 16:55:21
2026-07-09 17:08:49
孙有匪 incentive-icons
孙有匪
科技
1595文章数 2008关注度
往期回顾 全部

科技要闻

字节杀回来了!深度实测Seedream 5.0 Pro

头条要闻

哈兰德让鲁尼兑现承诺:你说挪威进八强就跳默西河漂流

头条要闻

哈兰德让鲁尼兑现承诺:你说挪威进八强就跳默西河漂流

体育要闻

信哈兰德吃小孩,还是信非洲足球会魔法?

娱乐要闻

陈翔发文“苍天饶过谁”登热搜,旧事再引关注

财经要闻

九部门:支持加快零售业创新发展

汽车要闻

理想纯电旗舰i9官宣 9系旗舰再添新车

态度原创

房产
亲子
时尚
手机
教育

房产要闻

猛踩油门!绿地,又拿下海南一个大城更!

亲子要闻

2026儿童睡袋品牌全图谱:从老牌到新锐,一文看懂市场格局

“长+长穿法”今夏又火了!这样穿时髦又显高

手机要闻

消息称“全球首款机器人手机”荣耀Robot Phone手机8月上市

教育要闻

致教师:暑假,不妨做一个“闲人”

无障碍浏览 进入关怀版