Python 如何将lxml xpath函数导入默认名称空间?
以下是一个例子:Python 如何将lxml xpath函数导入默认名称空间?,python,xpath,lxml,Python,Xpath,Lxml,以下是一个例子: >regexpNS=”http://exslt.org/regular-expressions" >>>find=etree.XPath(“//*[re:test(,“^abc$”,“i”)”, …名称空间={'re':regexpNS}) >>>root=etree.XML(“aBaBc”) >>>打印(查找(根)[0]。文本) aBc 我想将re:test()函数导入到默认名称空间,这样我就可以调用它,而无需前缀re:。我怎么做?谢谢 您可以将函数放入空函数命名空间中:
>regexpNS=”http://exslt.org/regular-expressions"
>>>find=etree.XPath(“//*[re:test(,“^abc$”,“i”)”,
…名称空间={'re':regexpNS})
>>>root=etree.XML(“aBaBc”)
>>>打印(查找(根)[0]。文本)
aBc
我想将
re:test()
函数导入到默认名称空间,这样我就可以调用它,而无需前缀re:
。我怎么做?谢谢 您可以将函数放入空函数命名空间中:
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“
不能从python中获得,只能从用C实现的lxml扩展中获得,因此您不能简单地将它分配给functions['test']
这意味着您需要在python中重新实现它,以将其分配给空函数名称空间
如果不值得费心键入三个字符,您可以使用此技巧将命名空间的re
前缀设置为全局:
etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'
那么,至少您不需要为每个xpath表达式传递名称空间dict。我对您提出的第二个解决方案感到非常兴奋,但它打破了xpath的行为。也就是说,如果我用一些正则表达式构造XPath而不传递名称空间(因为它是像您提到的那样设置的),那么在第二次求值时它就不起作用了。它不知怎么搞混了,失败时出现错误
XPath函数“{}match”未找到
。知道为什么吗?我不知道,不能复制这个。你确定你在任何地方都使用了re:match(…)
而不是match(…)
而没有前缀吗?我创建了一个MWE。。。编辑:MWE本身不工作,但它是一个导出的jupyter笔记本。似乎只有当2search
处于不同的位置时,才会在笔记本中失败cells@CiprianTomoiaga-嗯,那可能是个虫子,我不确定。看起来在第一次调用编译后的xpath表达式后,registerd前缀被遗忘了。。。不幸的是,我不能再多说了。也许你应该为此提出一个新问题。
etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'