python - 由于命名空间为空,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 中被注释掉了,但它们不起作用。命名空间前缀之一是空字符串,无法传递给命名空间字典。
无论如何,早上我会写可以克隆 SVG 文件并从根元素中删除属性,因为我知道这种方法有效。与此同时,如果有人能找到解决这个问题的真正方法,那么我将不胜感激(克隆文件似乎不是最理想的)。
PS 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"
推荐阅读
- c - 为什么这段代码在 Mac OS 和 Linux 中执行不同?
- vue.js - vuex - 未知的动作类型(无法调度我的动作)
- c# - How to set the index of a combobox that was dynamically added to a datagridview
- c# - 列表视图和组合框的 SelectedItem 颜色
- python - 如何检查一个字典的所有键是否存在于另一个字典中?
- excel - excel中数据量不均匀的插值
- sql - SQL循环表将记录插入新表,然后获取新ID并插入其他表
- javascript - 如何在不知道原始类型的情况下将缓冲区转换为字符串/数字/日期
- javascript - 反应导航抽屉多次更新
- components - 将查询从 index.js 移动到 GatsbyJS 中的组件后,无法读取未定义的属性 'allContentfulBlogPost'(使用 Contenful 和 GraphQL)