Python 3.x 如何使用xpath python lxml从svg获取元素,但返回空列表?

Python 3.x 如何使用xpath python lxml从svg获取元素,但返回空列表?,python-3.x,svg,xpath,lxml,Python 3.x,Svg,Xpath,Lxml,我正在尝试使用python-3和。 到目前为止,我一直在使用xpath从SVG获取元素 从lxml导入etree boarder=etree.parse('boarder.svg') Bd=boarder.xpath(“//g/path”) 打印(Bd) 当我运行代码时,我返回: [] 这是一个空列表。 我尝试将g/path元素作为一个元素访问,以便更改其属性 这是我正在使用的SVG('boarder.SVG'): image/svg+xml 到目前为止,我已经尝试过: 向xpath添

我正在尝试使用python-3和。 到目前为止,我一直在使用xpath从SVG获取元素

从lxml导入etree
boarder=etree.parse('boarder.svg')
Bd=boarder.xpath(“//g/path”)
打印(Bd)
当我运行代码时,我返回:

[]
这是一个空列表。 我尝试将
g/path
元素作为一个元素访问,以便更改其属性

这是我正在使用的SVG('boarder.SVG'):


image/svg+xml
到目前为止,我已经尝试过:

  • 向xpath添加名称空间

  • 获取
    g
    的文档根,试图将其作为元素访问


要查找
svg
元素,请尝试使用xpath。使用
local-name()
name()

输出:
要查找
svg
元素,请尝试使用xpath。使用
local-name()
name()

输出:
请告诉我们你到底试了什么。如果将名称空间考虑在内,它确实可以工作:
Bd=boarder.xpath('//svg:g/svg:path',名称空间={“svg”:http://www.w3.org/2000/svg“})
。你能提供一个元素前后的例子吗?@mzjn我对xml还是很熟悉。我不知道我必须添加
svg:
,并定义名称空间。我认为仅仅设置
名称空间
就足够了。如果我使用
名称空间={*:“http://www.w3.org/2000/svg“}
,我是否可以省略
svg:
?请告诉我们您实际尝试了什么。如果将名称空间考虑在内,它确实可以工作:
Bd=boarder.xpath('//svg:g/svg:path',名称空间={“svg”:http://www.w3.org/2000/svg“})
。你能提供一个元素前后的例子吗?@mzjn我对xml还是很熟悉。我不知道我必须添加
svg:
,并定义名称空间。我认为仅仅设置
名称空间
就足够了。如果我使用
名称空间={*:“http://www.w3.org/2000/svg“}
,我是否可以省略
svg:
?这样编写路径表达式是不必要的复杂。正确的方法是用前缀定义名称空间,然后在元素名称前加前缀。@MathiasMüller我该怎么做?您能提供一些代码示例吗?编写这样的路径表达式是不必要的复杂。正确的方法是用前缀定义名称空间,然后在元素名称前加前缀。@MathiasMüller我该怎么做?你能提供一些代码示例吗?
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