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

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.

相关推荐
热点推荐
红星深度|“山寨兵马俑”网红景区荒废背后:开业两年半闭园 老板去世,家人称他心太大

红星深度|“山寨兵马俑”网红景区荒废背后:开业两年半闭园 老板去世,家人称他心太大

红星新闻
2024-04-26 23:44:06
私人影院提供特色观影服务?我试图前往体验,却发现掉入桃色陷阱

私人影院提供特色观影服务?我试图前往体验,却发现掉入桃色陷阱

亲爱的落落
2024-04-15 10:57:58
他弃医从政,曾担任上海副市长,现任湖南省委书记,百姓的父母官

他弃医从政,曾担任上海副市长,现任湖南省委书记,百姓的父母官

蹲马桶看历史
2024-04-27 17:26:27
危险信号!俄罗斯民众向乌克兰国防军汇款:这场战争的代价是我们

危险信号!俄罗斯民众向乌克兰国防军汇款:这场战争的代价是我们

娱宙观
2024-04-26 11:02:04
有人预测:今明两年,若不出意外,社会有可能发生“5大转变”

有人预测:今明两年,若不出意外,社会有可能发生“5大转变”

阿离家居
2024-04-27 17:43:26
气愤!神舟十八升空,一群小丑竟按耐不住了,纷纷叫嚣:关我啥事

气愤!神舟十八升空,一群小丑竟按耐不住了,纷纷叫嚣:关我啥事

搞笑的阿票
2024-04-27 13:01:55
被新疆淘汰,郭士强摊牌发声,官宣决定,去向曝光,辽宁期待

被新疆淘汰,郭士强摊牌发声,官宣决定,去向曝光,辽宁期待

东球弟
2024-04-27 07:43:57
刘德华对赌失败欠巨款?近照满头白发断崖式衰老,全国巡演狂捞金

刘德华对赌失败欠巨款?近照满头白发断崖式衰老,全国巡演狂捞金

开心蕾蕾
2024-04-26 09:59:43
俗话说“5月吃三白,一年病不来”,三天两头吃一次,健康好身体

俗话说“5月吃三白,一年病不来”,三天两头吃一次,健康好身体

荷兰豆爱健康
2024-04-26 16:38:18
下一站切尔西!穆里尼奥收三年合同,高层给出承诺,球迷笑了

下一站切尔西!穆里尼奥收三年合同,高层给出承诺,球迷笑了

祥谈体育
2024-04-27 15:57:14
不是阿兰也不是艾克森!武磊力荐两人在中泰之战顶替他,让人意外

不是阿兰也不是艾克森!武磊力荐两人在中泰之战顶替他,让人意外

罗掌柜体育
2024-04-27 15:18:05
妻子与男性朋友爬山失联后续,老公最新发声:妻子爬一晚上太累了

妻子与男性朋友爬山失联后续,老公最新发声:妻子爬一晚上太累了

小毅讲历史
2024-04-26 09:10:14
一个国家被踢出SWIFT系统的后果非常的严重!

一个国家被踢出SWIFT系统的后果非常的严重!

华夏司马北
2024-04-24 22:01:49
单身兽医乔乔·弗莱彻准备好迎接夏天了,好热情啊,哈哈

单身兽医乔乔·弗莱彻准备好迎接夏天了,好热情啊,哈哈

风趣环球笔记
2024-04-27 09:58:23
纪云浩前途尽毁!涉嫌学历造假、荣誉造假,父亲身份疑似遭曝光

纪云浩前途尽毁!涉嫌学历造假、荣誉造假,父亲身份疑似遭曝光

叶公子
2024-04-24 20:45:23
感动全网!上海45岁儿子每天中午2小时车程赶回家!照料痴呆母亲10年:希望她最后一个忘记我

感动全网!上海45岁儿子每天中午2小时车程赶回家!照料痴呆母亲10年:希望她最后一个忘记我

新民晚报
2024-04-19 19:15:22
刚刚结束访华行程的布林肯马上指责中国干预即将来临的美国大选

刚刚结束访华行程的布林肯马上指责中国干预即将来临的美国大选

止戈军是我
2024-04-27 10:28:33
太会玩了!以收购为名狂拉11个涨停,接着宣布收购失败大割韭菜!

太会玩了!以收购为名狂拉11个涨停,接着宣布收购失败大割韭菜!

云姐闲聊
2024-04-27 08:42:52
金靖回应不官宣结婚原因,大赞老公舒奕橙温柔,孩子代号首曝光

金靖回应不官宣结婚原因,大赞老公舒奕橙温柔,孩子代号首曝光

扒虾侃娱
2024-04-25 20:46:34
爱信、ZF时代彻底落幕:时代淘汰变速箱的时候,招呼都没打一声!

爱信、ZF时代彻底落幕:时代淘汰变速箱的时候,招呼都没打一声!

汽车扒壹扒
2024-04-26 22:34:05
2024-04-27 21:08:49
孙有匪
孙有匪
科技
1595文章数 2009关注度
往期回顾 全部

科技要闻

特斯拉这款车型刚上市几天,就上调价格

头条要闻

警车鸣笛进村指名道姓喊话一村民"涉嫌嫖娼" 当地回应

头条要闻

警车鸣笛进村指名道姓喊话一村民"涉嫌嫖娼" 当地回应

体育要闻

时代要落幕了?詹姆斯杜兰特陷0-3绝境

娱乐要闻

金靖回应不官宣恋情结婚的原因

财经要闻

北京房价回到2016年

汽车要闻

5月上市/智能化丰富 海狮 07EV正式到店

态度原创

健康
教育
手机
家居
军事航空

这2种水果可降低高血压死亡风险

教育要闻

70岁奶奶教娃念英文,开口发音标准似听力考试,一听身份没想到

手机要闻

vivo X100 Ultra 顶配版通过无线电认证,内置卫星通信系统

家居要闻

光影之间 空间暖意打造生活律动

军事要闻

佩洛西称俄在支持"挺巴"的美国反战学生 扎哈罗娃回应

无障碍浏览 进入关怀版