我想解析這個。這是一個YouTube Feed。我正在基於tutorial中的代碼工作。我想獲取嵌套在feed
下的所有entry
節點。爲什麼這個xpath表達式返回一個空列表?
from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries
出於某種原因entries
是一個空列表。爲什麼?
我想解析這個。這是一個YouTube Feed。我正在基於tutorial中的代碼工作。我想獲取嵌套在feed
下的所有entry
節點。爲什麼這個xpath表達式返回一個空列表?
from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries
出於某種原因entries
是一個空列表。爲什麼?
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...
有什麼辦法可以避免指定前綴?這是一個皮塔... – misha
我認爲你可以做到這一點,只有當你是這個XML文件的作者放棄這個命名空間 – 2013-08-21 11:28:33
你不應該「刪除命名空間」,因爲有一個原因,爲什麼Atom飼料使用它。我已經添加了一些可以讓你的生活更輕鬆的例子。 –
這是因爲XML中的命名空間。這裏是一個解釋:http://www.edankert.com/defaultnamespaces.html#Conclusion。
什麼是「文本」是什麼樣子? – 2013-08-21 11:16:33
這是鏈接中的XML,從文件中讀取。 – misha
XML是一團糟,你不能正確縮進它嗎? –