如何将lxml xpath函数导入默认命名空间?

时间:2013-06-25 08:19:57

标签: python xpath lxml

这是lxml doc中的一个示例:

>>> regexpNS = "http://exslt.org/regular-expressions"
>>> find = etree.XPath("//*[re:test(., '^abc$', 'i')]",
...                    namespaces={'re':regexpNS})

>>> root = etree.XML("<root><a>aB</a><b>aBc</b></root>")
>>> print(find(root)[0].text)
aBc

我想将re:test()函数导入默认命名空间,以便我可以调用它而不使用前缀re:。我该怎么做?谢谢!

1 个答案:

答案 0 :(得分:4)

您可以将函数放在空函数名称空间中:

functionNS = etree.FunctionNamespace(None)
functionNS['test'] = lambda context, nodes, *args: print(context, nodes, args)

通过这样做,新的test函数已经注册了空名称空间前缀,这意味着您可以像这样使用它:

root.xpath("//*[test(., 'arg1', 'arg2')]")

不幸的是,"{http://exslt.org/regular-expressions}test"调用的function不能从python中获得,只能在C中实现的lxml扩展中,因此您不能简单地将其分配给functionNS['test']

这意味着您需要在python中重新实现它以将其分配给空函数名称空间...

如果你输入三个字符并不值得麻烦,你可以使用这个技巧为全局命名空间创建re前缀:

etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'

然后至少你不需要为每个xpath表达式传递名称空间dict。