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"
我有一个 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"