Python 由于命名空间为空,XPath lxml 无法读取 SVG 路径元素?

Python XPath lxml could not read SVG path element due to empty namespace?

我有一个 SVG (Xml) 文件,我想从中 select 一些元素。为了 MCRE,我将文件缩减为

<svg >
    <!-- xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" -->
    <g>
       <path style="fill:#19518b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
       <path style="fill:#a80c3d;fill-opacity:1;fill-rule:nonzero;stroke:none" />
       <path style="fill:#a98b6e;fill-opacity:1;fill-rule:nonzero;stroke:none" />
   </g>
</svg>

根元素的一些可选命名空间属性位于注释中,因此可以将它们插回以复制真实场景(其中 SVG 根元素被完全赋予了属性)。

来自以下 Xml (SVG) 我想 select 使用 fill:#19518b;fill-opacity:1;fill-rule:nonzero;stroke:none 设置样式的元素。有一个比赛。以下代码适用于给定的 Xml.

from lxml import etree
sFileName = 'C:/Users/Simon/Downloads/pdf_skunkworks/inflation-report-may-2018-page6 - Copy.svg'

tree = etree.Parse(sFileName)
svgNamespace = "xmlns:svg='http://www.w3.org/2000/svg'"
#xpath = r"//svg:path[@style='fill:#19518b;fill-opacity:1;fill-rule:nonzero;stroke:none']"
xpath = r"//path[@style='fill:#19518b;fill-opacity:1;fill-rule:nonzero;stroke:none']"
Print (XPath)
#bluePaths = tree.xpath(xpath,namespaces={   'svg': svgNamespace  })
bluePaths = tree.XPath(XPath)

print (bluePaths[0])

但它适用于给定的 Xml,因为它没有在真实 SVG 文件中找到的命名空间属性。一旦我重新插入名称空间属性

<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"    >

然后 Python 代码(给定的失败)。我知道我需要使用名称空间,您可以看到我的尝试在 Python 中被注释掉了,但它们不起作用。命名空间前缀之一是空字符串,无法传递到命名空间字典。

无论如何,早上我会写 could 克隆 SVG 文件并从根元素中删除属性,因为我知道这种方法有效。同时,如果有人能找到解决这个问题的真正方法,我将不胜感激(克隆文件似乎不是最佳选择)。

P.S。 SVG 是从命令行的 运行 Inkscape 创建的,我给了一个单页 pdf 并要求导出纯 svg。

这是因为命名空间 URI 只是 http://www.w3.org/2000/svg

变化:

svgNamespace = "xmlns:svg='http://www.w3.org/2000/svg'"

至:

svgNamespace = "http://www.w3.org/2000/svg"