首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将lxml xpath函数导入到默认命名空间?

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

Stack Overflow用户
提问于 2013-06-25 16:19:57
回答 1查看 1.5K关注 0票数 3

这是一个用lxml doc编写的示例

代码语言:javascript
复制
>>> 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:的情况下调用它。我该怎么做呢?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 17:33:07

您可以将函数放入空的函数命名空间中:

代码语言:javascript
复制
functionNS = etree.FunctionNamespace(None)
functionNS['test'] = lambda context, nodes, *args: print(context, nodes, args)

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

代码语言:javascript
复制
root.xpath("//*[test(., 'arg1', 'arg2')]")

不幸的是,为"{http://exslt.org/regular-expressions}test"调用的function不能从python中获得,只能从用C实现的lxml扩展中获得,所以不能简单地将它赋给functionNS['test']

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

如果这不值得您省去输入三个字符的麻烦,那么您可以使用此技巧使名称空间的re前缀成为全局的:

代码语言:javascript
复制
etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'

那么至少您不需要为每个xpath表达式传递名称空间字典。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17292421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档