2013-08-21 154 views
2

我想解析這個。這是一個YouTube Feed。我正在基於tutorial中的代碼工作。我想獲取嵌套在feed下的所有entry節點。爲什麼這個xpath表達式返回一個空列表?

from lxml import etree 
root = etree.fromstring(text) 
entries = root.xpath("/feed/entry") 
print entries 

出於某種原因entries是一個空列表。爲什麼?

+0

什麼是「文本」是什麼樣子? – 2013-08-21 11:16:33

+0

這是鏈接中的XML,從文件中讀取。 – misha

+0

XML是一團糟,你不能正確縮進它嗎? –

回答

4

feed及其所有子項實際上都位於http://www.w3.org/2005/Atom命名空間中。你需要告訴你的XPath說:

entries = root.xpath("/atom:feed/atom:entry", 
        namespaces={'atom': 'http://www.w3.org/2005/Atom'}) 

,或者,如果你想改變默認的空命名空間:

entries = root.xpath("/feed/entry", 
        namespaces={None: 'http://www.w3.org/2005/Atom'}) 

,或者,如果你不希望在所有使用shorthandles:

entries = root.xpath("/{http://www.w3.org/2005/Atom}feed/{http://www.w3.org/2005/Atom}entry") 

據我所知,「本地命名空間」是隱含地假設您搭配,這樣在同一個命名空間子女的操作不要求你重新設定它的工作節點。所以,你應該能夠做到的線沿線的東西:

feed = root.find("/atom:feed", 
        namespaces={'atom': 'http://www.w3.org/2005/Atom'}) 

title = feed.xpath("title") 
entries = feed.xpath("entries") 
# etc... 
+0

有什麼辦法可以避免指定前綴?這是一個皮塔... – misha

+0

我認爲你可以做到這一點,只有當你是這個XML文件的作者放棄這個命名空間 – 2013-08-21 11:28:33

+0

你不應該「刪除命名空間」,因爲有一個原因,爲什麼Atom飼料使用它。我已經添加了一些可以讓你的生活更輕鬆的例子。 –

相關問題