Select xml xpath 的节点,属性值包含撇号
Select xml node by xpath with attribute value containing apostroph
我正在尝试从给定的 XML 文件中提取一些数据。因此,我必须 select 某些特定节点的属性值。我的 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=''BentonSans Medium']"
print(root.findall(xPath))
我总是遇到这种错误:
File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 214, in prepare_predicate
raise SyntaxError("invalid predicate")
有人知道如何使用 XPath select 这些节点吗?
试试这个:
xPath = ".//g[@font-family=\"'BentonSans Medium'\"]"
您的代码失败,因为您没有放置结束单引号:
xPath = ".//g[@font-family=''BentonSans Medium']"
应该在最后一个'
之后:
xPath = ".//g[@font-family=''BentonSans Medium'']"
但它不会使 XPath 表达式正确,因为 '
会按原样解释。
顺便说一句,如果你想检查 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
似乎更灵活,我建议改用这种方法。
我正在尝试从给定的 XML 文件中提取一些数据。因此,我必须 select 某些特定节点的属性值。我的 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=''BentonSans Medium']"
print(root.findall(xPath))
我总是遇到这种错误:
File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 214, in prepare_predicate
raise SyntaxError("invalid predicate")
有人知道如何使用 XPath select 这些节点吗?
试试这个:
xPath = ".//g[@font-family=\"'BentonSans Medium'\"]"
您的代码失败,因为您没有放置结束单引号:
xPath = ".//g[@font-family=''BentonSans Medium']"
应该在最后一个'
之后:
xPath = ".//g[@font-family=''BentonSans Medium'']"
但它不会使 XPath 表达式正确,因为 '
会按原样解释。
顺便说一句,如果你想检查 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
似乎更灵活,我建议改用这种方法。