这是一个用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:的情况下调用它。我该怎么做呢?谢谢!
发布于 2013-06-25 17:33:07
您可以将函数放入空的函数命名空间中:
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表达式传递名称空间字典。
https://stackoverflow.com/questions/17292421
复制相似问题