2013-06-25 60 views
3

這是一個lxml doc例如:如何將lxml xpath函數導入默認名稱空間?

>>> 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:。我該怎麼做?謝謝!

回答

3

你可以把一個函數在空函數命名空間:

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不能從蟒蛇,只能從C語言實現的LXML擴展中,所以你不能簡單地把它分配給functionNS['test']

這意味着你需要重新實現它在python將其分配到空函數命名空間...

如果這是不值得的麻煩,爲您饒了你鍵入三個字符,你可以使用這一招,以便爲全球命名空間的re前綴:

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

那麼至少你不需要通過命名空間字典每個XPath表達式。

+0

我對你提出的第二個解決方案感到非常興奮,但它打破了XPath的行爲。也就是說,如果我用一些正則表達式構造一個沒有傳遞名稱空間的XPath(因爲它的設置就像你提到的那樣),它在第二次評估時不起作用。它不知何故變得困惑,失敗與錯誤'XPath功能'{}匹配'找不到'。任何想法爲什麼? –

+0

我不知道,不能重現這一點。你確定你在任何地方都使用're:match(...)',而不是在沒有前綴的地方匹配(...)'? – mata

+0

我創建了一個MWE [這裏](https://gist.github.com/cipri-tom/f85b246fc8a250ea4debf9178a2732b9)... **編輯**:MWE本身不工作,但它是一個輸出jupyter筆記本。它似乎只在筆記本上失敗,當2'搜索'在不同的單元格 –

相關問題