如何使用 xpath python lxml 从 svg 获取元素,但返回空列表?
How to get element from svg using xpath python lxml, but returning empty list?
我正在尝试使用 python-3 和 lxml 编辑 SVG 文件。
到目前为止,我一直坚持使用 xpath 从 SVG 获取元素。
from lxml import etree
boarder = etree.parse('boarder.svg')
Bd = boarder.xpath('//g/path')
print(Bd)
当我运行代码时,我返回:
[]
这是一个空列表。
我试图将 g/path
元素作为元素访问,以便我可以更改其属性。
这是我正在使用的 SVG ('boarder.svg'):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg8"
version="1.1"
viewBox="0 0 10 10"
height="10mm"
width="10mm">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-287)"
id="layer1">
<path
id="rect1379"
d="m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z"
style="opacity:0.95;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</svg>
到目前为止我已经尝试过:
正在将名称 space 添加到 xpath。
正在获取 g
的文档根目录以尝试将其作为元素访问。
要查找 svg
元素,请尝试遵循 xpath.Use local-name()
或 name()
from lxml import etree,html
boarder = etree.parse('boarder.svg')
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@d')[0]
print(Bd)
或
Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@d')[0]
print(Bd)
输出:
rect1379
m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z
类似于 mzjn 对 OP 的评论,我想出了一个方法来做到这一点 generically/nicely:
boarder = etree.parse('boarder.svg')
ns = boarder.getroot().nsmap
Bd = boarder.xpath('//g/path', ns)
print(Bd)
这也适用于 find、findall 和 iterfind。
我正在尝试使用 python-3 和 lxml 编辑 SVG 文件。 到目前为止,我一直坚持使用 xpath 从 SVG 获取元素。
from lxml import etree
boarder = etree.parse('boarder.svg')
Bd = boarder.xpath('//g/path')
print(Bd)
当我运行代码时,我返回:
[]
这是一个空列表。
我试图将 g/path
元素作为元素访问,以便我可以更改其属性。
这是我正在使用的 SVG ('boarder.svg'):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg8"
version="1.1"
viewBox="0 0 10 10"
height="10mm"
width="10mm">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-287)"
id="layer1">
<path
id="rect1379"
d="m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z"
style="opacity:0.95;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</svg>
到目前为止我已经尝试过:
正在将名称 space 添加到 xpath。
正在获取
g
的文档根目录以尝试将其作为元素访问。
要查找 svg
元素,请尝试遵循 xpath.Use local-name()
或 name()
from lxml import etree,html
boarder = etree.parse('boarder.svg')
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@d')[0]
print(Bd)
或
Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@d')[0]
print(Bd)
输出:
rect1379
m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z
类似于 mzjn 对 OP 的评论,我想出了一个方法来做到这一点 generically/nicely:
boarder = etree.parse('boarder.svg')
ns = boarder.getroot().nsmap
Bd = boarder.xpath('//g/path', ns)
print(Bd)
这也适用于 find、findall 和 iterfind。