2013-06-25 1 views
3

lxml doc의 예입니다lxml xpath 함수를 기본 네임 스페이스로 가져 오는 방법은 무엇입니까?

내가 접두사 re:없이 호출 할 수 있도록 공간을 기본 re:test() 기능을 가져올
>>> 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 

. 내가 어떻게 해? 감사!

답변

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']에 할당 할 수 없습니다. 당신이 빈 기능 네임 스페이스에 할당하는 파이썬에서 다시 구현해야 할 것입니다 의미

...

그 문제는 세 개의 문자를 입력을 절약하기 위해,이 트릭을 사용할 수있는 가치가 없어 경우 글로벌 네임 스페이스에 대한 re 접두사를 만들기 위해 :

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

그러면 적어도 당신은 네임 스페이스는 각 XPath 식에 대한 DICT 통과 할 필요가 없습니다.

+0

제안한 두 번째 솔루션에 대해 매우 흥분했지만 XPath의 동작이 나에게 부정적이었습니다. 즉, 네임 스페이스를 지나치지 않고 정규 표현식을 사용하여 XPath를 구성한 경우 (언급 한 것처럼 설정 되었기 때문에) 두 번째 평가시에는 작동하지 않습니다. 어떤 식 으로든 혼란스러워하고,'XPath 함수 '{}가'찾을 수 없습니다 '오류로 실패합니다. 왜 그런가? –

+0

모르겠다. 재현 할 수 없다. 그리고 당신은're : match (...)'를 어디에나 사용하고 있고 어떤 곳에 접두어를 붙이지 않고'match (...) '하지 않을 것이라고 확신합니까? – mata

+0

MWE [여기] (https://gist.github.com/cipri-tom/f85b246fc8a250ea4debf9178a2732b9)를 만들었습니다. ** 편집 ** : MWE는 자체적으로 작동하지 않지만 수출 된 주피터 노트북입니다 . 2 개의 '검색'이 다른 셀에있을 때 노트북에서만 실패하는 것 같습니다. –

관련 문제