Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将lxml xpath函数导入默认名称空间?_Python_Xpath_Lxml - Fatal编程技术网

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笔记本。似乎只有当2
search
处于不同的位置时,才会在笔记本中失败cells@CiprianTomoiaga-嗯,那可能是个虫子,我不确定。看起来在第一次调用编译后的xpath表达式后,registerd前缀被遗忘了。。。不幸的是,我不能再多说了。也许你应该为此提出一个新问题。
etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'