2011-06-24 50 views
6

我想爲具有名稱空間但沒有前綴的元素執行iterfind()。我想打電話Python lxml iterfind w /名稱空間但前綴=無

iterfind([tagname])iterfind([tagname], [namespace dict])

我不小心輸入標籤每次如下:

"{%s}tagname" % tree.nsmap[None]

詳細

我運行來自Google API的xml響應。根節點定義了幾個名稱空間,其中包括沒有前綴的名稱空間:xmlns="http://www.w3.org/2005/Atom"

看起來好像當我試圖通過我的etree進行搜索時,所有行爲都像我期望的帶有前綴的元素一樣。例如: -

>>> for x in root.iterfind('dxp:segment'): print x 
... 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211b98> 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211d78> 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211a08> 
>>> 

但是,當我試圖尋找的東西沒有前綴,搜索不會自動添加相應的命名空間root.nsmap[None]。例如: -

>>> for x in root.iterfind('entry'): print x 
... 
>>> 

即使我試着投命名空間地圖中的可選參數爲iterfind,它不會附加命名空間。

回答

3

試試這個:

for x in root.iterfind('{http://www.w3.org/2005/Atom}entry'): 
    print x 

欲瞭解更多信息:閱讀文檔:http://lxml.de/tutorial.html#namespaces

如果您不想鍵入,並要提供一個命名空間的地圖,你總是有使用前綴,像這樣的例子:

nsmap = {'atom': 'http://www.w3.org/2005/Atom'} 
for x in root.iterfind('atom:entry', namespaces=nsmap): 
    print x 

(同樣的事情會發生,如果你想使用XPath)

文檔中使用了什麼前綴(如果有的話)並不重要,它是關於指定元素的完全限定名稱,或者使用大括號表示法將URI寫出來,或使用映射到的前綴一個URI。

+0

謝謝,但問題不是我不知道如何獲得匹配標籤的元素。問題是我只想輸入沒有命名空間的標籤,只提供命名空間表,讓魔術在後臺發生(如果有前綴涉及的話)。 – JellicleCat

+0

@JellicleCat:更新了我的答案,希望它有幫助。 – Steven

相關問題