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



我有一个SVG(Xml(文件,我想从中选择一些元素。 为了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( 中,我想选择带有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 中被注释掉了,但它们不起作用。 其中一个命名空间前缀是空字符串,无法传递到命名空间字典。

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

附言 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"

最新更新