Python lxml xpath XPathEvalError:表达式无效 - 为什么?

时间:2013-03-18 21:16:46

标签: python xml xpath lxml

我正在尝试使用lxml解析SVG文档。这是我的代码:

nsmap = {
    'svg': 'http://www.w3.org/2000/svg',
    'xlink': 'http://www.w3.org/1999/xlink',
}

root = etree.XML(svg)

# this works (finds the element with the given ID)
root.xpath('./svg:g/svg:g/svg:g[@id="route_1_edge"]', namespaces=nsmap)

# this yields "XPathEvalError: Invalid expression"
root.xpath('./svg:g/svg:g/svg:g[fn:startswith(@id,"route_1")]', namespaces=nsmap)

任何人都知道为什么第一个有效,第二个没有?如果我将第三个svg:g更改为svg:text我没有得到异常,所以它似乎与g元素有关,特别是它不喜欢,尽管再次,简单的g[@id="foo"]搜索工作正常。

1 个答案:

答案 0 :(得分:2)

“startswith”函数拼写为starts-with。另外,省略fn:

root.xpath('./svg:g/svg:g/svg:g[starts-with(@id,"route_1")]', namespaces=nsmap)

import lxml.etree as etree
import lxml.builder as builder

nsmap = {
    'svg': 'http://www.w3.org/2000/svg',
    'xlink': 'http://www.w3.org/1999/xlink',
}

E = builder.ElementMaker(
    namespace='http://www.w3.org/2000/svg',
    nsmap=nsmap)

root = (
    E.root(
        E.g(
            E.g(
                E.g(id = "route_1_edge" )))))

print(etree.tostring(root, pretty_print=True))
print(root.xpath('./svg:g/svg:g/svg:g[@id="route_1_edge"]', namespaces=nsmap))
print(root.xpath('./svg:g/svg:g/svg:g[starts-with(@id,"route_1")]', namespaces=nsmap))

产量

<svg:root xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <svg:g>
    <svg:g>
      <svg:g id="route_1_edge"/>
    </svg:g>
  </svg:g>
</svg:root>

[<Element {http://www.w3.org/2000/svg}g at 0xb7462c34>]
[<Element {http://www.w3.org/2000/svg}g at 0xb7462be4>]