python利用lxml庫(kù)剩下操作svg圖片
在大多數(shù)場(chǎng)景中,我們都用 lxml 庫(kù)解析網(wǎng)頁(yè)源碼,但你是否知道,lxml 庫(kù)也是可以操作 svg 圖片的。我們可以使用 lxml 中的 etree 模塊來(lái)解析 SVG 文件,然后使用 SVG 中的各種元素和屬性來(lái)進(jìn)行操作。
lxml 操作 svg 圖片示例
在本篇博客的入門(mén)篇,我們首先使用一下 lxml 庫(kù)解析 svg 文件,并修改它的顏色。
SVG 圖片生成,可以查看 《Python 生成 svg 圖片,一篇博客帶你掌握 Python 與 svg 之間的操作》 這篇博客。
借用 svgwrite 庫(kù),生成一個(gè)紅色背景的 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()
同時(shí)查看一下 svg 內(nèi)容,如下所示。
<?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">橡皮擦</text> </svg>
我們需要替換的內(nèi)容是 fill="white" ,將其修改為 fill="#03a9f4"。使用 lxml 讀取該文件,進(jìn)行顏色替換。
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))
此時(shí)替換之后,再次查看 svg 圖片源碼內(nèi)容,如下所示。
<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">橡皮擦</text> </svg>
重點(diǎn)注意 text 元素部分,發(fā)現(xiàn) fill 屬性的值已經(jīng)被修改成最新的顏色了。
lxml 給 svg 圖片添加新元素
使用 append() 函數(shù)可以給 svg 圖片添加新元素,例如下述代碼將添加一個(gè)矩形到圖片中。
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', style='fill:#03a9f4') svg_tree.append(new_element) # 保存修改后的SVG文件 with open('modified_demo.svg', 'wb') as f: f.write(etree.tostring(svg_tree, pretty_print=True))
這里矩形的定位并沒(méi)有精確計(jì)算,實(shí)現(xiàn)的效果圖如下所示。
lxml 刪除 svg 圖片中的元素
除新增外,還可以對(duì) svg 中元素進(jìn)行刪除操作。示例代碼如下所示。
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) # 通過(guò) xpath 查找需要?jiǎng)h除的元素 elements_to_remove = svg_tree.xpath("http://text") print(elements_to_remove) for element in elements_to_remove: element.getparent().remove(element)
運(yùn)行代碼會(huì)發(fā)現(xiàn)通過(guò) xpath 無(wú)法查找到目標(biāo)元素 text,這時(shí)因?yàn)?SVG 文件中含有命名空間,導(dǎo)致 xpath 語(yǔ)法查詢(xún)不到相應(yīng)的元素,可以通過(guò)為 xpath 語(yǔ)法指定命名空間來(lái)解決這個(gè)問(wèn)題。
添加命名空間之后的提取語(yǔ)法如下所示。
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]} # 通過(guò) xpath 查找需要?jiǎng)h除的元素 elements_to_remove = svg_tree.xpath("http://svg:text", namespaces=ns) print(elements_to_remove)
尤其注意 xpath 部分需要使用 //svg:text 進(jìn)行提取。
如果不提前生命 ns 變量,可以使用下述代碼進(jìn)行指定命名空間。
elements_to_remove = svg_tree.xpath("http://svg:circle", namespaces={'svg': 'http://www.w3.org/2000/svg'})
有了上述基礎(chǔ)之后,完整的 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]} # 通過(guò) xpath 查找需要?jiǎng)h除的元素 elements_to_remove = svg_tree.xpath("http://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庫(kù)剩下操作svg圖片的詳細(xì)內(nèi)容,更多關(guān)于python lxml操作svg的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 使用Python插入SVG到PDF文檔中的方法示例
- 使用Python實(shí)現(xiàn)Excel文件轉(zhuǎn)換為SVG格式
- Python實(shí)現(xiàn)Word文檔轉(zhuǎn)換為圖片(JPG、PNG、SVG等常見(jiàn)格式)
- 使用Python代碼實(shí)現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換
- python Pygal庫(kù)生成SVG(可縮放矢量圖形)圖表示例
- python之matplotlib矢量圖svg?emf
- 一文帶你了解Python與svg之間的操作
- Python3.7將普通圖片(png)轉(zhuǎn)換為SVG圖片格式(網(wǎng)站logo圖標(biāo))動(dòng)起來(lái)
- Python中CairoSVG庫(kù)的使用教程
相關(guān)文章
Python自動(dòng)化處理日常任務(wù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Python自動(dòng)化處理日常任務(wù),例如自動(dòng)化文件管理,自動(dòng)化定時(shí)任務(wù),自動(dòng)化發(fā)送郵件等,有需要的小伙伴可以參考一下2025-01-01python標(biāo)識(shí)符命名規(guī)范原理解析
這篇文章主要介紹了python標(biāo)識(shí)符命名規(guī)范原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Python 解析簡(jiǎn)單的XML數(shù)據(jù)
這篇文章主要介紹了Python 如何解析簡(jiǎn)單的XML數(shù)據(jù),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07關(guān)于win10在tensorflow的安裝及在pycharm中運(yùn)行步驟詳解
這篇文章主要介紹了關(guān)于win10在tensorflow的安裝及在pycharm中運(yùn)行的步驟詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python網(wǎng)絡(luò)爬蟲(chóng)學(xué)習(xí)筆記(1)
這篇文章主要為大家詳細(xì)介紹了python網(wǎng)絡(luò)爬蟲(chóng)學(xué)習(xí)筆記的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04TensorFlow中權(quán)重的隨機(jī)初始化的方法
本篇文章主要介紹了TensorFlow中權(quán)重的隨機(jī)初始化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02