通过xpath选择xml节点,其属性值包含apostroph

时间:2016-12-18 10:28:35

标签: python xml xpath lxml apostrophe

我正在尝试从给定的XML文件中提取一些数据。因此,我必须通过其属性值选择一些特定节点。我的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8" ?>
<svg ....>
    ....
    <g font-family="'BentonSans Medium'" font-size="12">
        <text>bla bla bla</text>
        ....
    </g>
    ....
</svg>

我试图逃避价值观中的叛逆者,但我无法让它发挥作用。

from lxml import etree as ET

tree = ET.parse("file.svg")
root = tree.getroot()

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;]"
print(root.findall(xPath))

我总是遇到这种错误:

File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 214, in prepare_predicate
raise SyntaxError("invalid predicate")

任何人都有想法如何使用XPath选择这些节点?

1 个答案:

答案 0 :(得分:0)

试试这个:

xPath = ".//g[@font-family=\"'BentonSans Medium'\"]"

您的代码失败,因为您没有填写结束单引号:

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;]"

应该在最后&apos;之后:

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;']"

但它没有使XPath表达式正确,因为&apos;被解释为原样。

顺便说一下,如果你想检查font-family 是否包含给定的字符串,请使用contains() XPath函数和xpath方法:

xPath = '//g[contains(@font-family, "BentonSans Medium")]'
print(root.xpath(xPath))

输出

[<Element g at 0x7f2093612108>]

示例代码获取包含g字符串font-family属性值的所有BentonSans Medium元素。

我不知道为什么findall方法不适用于contains(),但xpath似乎更灵活,我建议使用此方法。