关于python:通过xpath选择xml节点,属性值包含撇号
Select xml node by xpath with attribute value containing apostroph
我正在尝试从给定的 XML 文件中提取一些数据。因此,我必须通过它们的属性值来选择一些特定的节点。我的 XML 如下所示:
|
1
2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8" ?>
<svg ....> .... <g font-family="'BentonSans Medium'" font-size="12"> <text>bla bla bla</text> .... </g> .... </svg> |
我已尝试转义值中的撇号,但无法正常工作。
|
1
2 3 4 5 6 7 |
from lxml import etree as ET
tree = ET.parse("file.svg") xPath =".//g[@font-family='BentonSans Medium]" |
我总是遇到这种错误:
|
1
2 |
File"C:\Python34\lib\site-packages\lxml\_elementpath.py", line 214, in prepare_predicate
raise SyntaxError("invalid predicate") |
有人知道如何使用 XPath 选择这些节点吗?
试试这个:
|
1
|
xPath =".//g[@font-family="'BentonSans Medium'"]"
|
你的代码失败了,因为你没有放单引号:
|
1
|
xPath =".//g[@font-family='BentonSans Medium]"
|
应该在最后一个:
之后
|
1
|
xPath =".//g[@font-family='BentonSans Medium']"
|
但它不会使 XPath 表达式正确,因为 被原样解释。
顺便说一句,如果要检查 font-family 是否包含给定的字符串,请使用 contains() XPath 函数和 xpath 方法:
|
1
2 |
xPath = '//g[contains(@font-family,"BentonSans Medium")]'
print(root.xpath(xPath)) |
输出
|
1
|
[<Element g at 0x7f2093612108>]
|
示例代码获取所有 g 元素,其 font-family 属性值包含 BentonSans Medium 字符串。
我不知道为什么 findall 方法不适用于 contains(),但是 xpath 似乎更灵活,我建议改用这种方法。
相关讨论
- 非常感谢你。你的小语法调整做到了!