2012-10-12 80 views
6

如何在Python中使用Elementtree在XML中搜索特定於名稱空間的標記?在Python中使用Elementtree解析RSS

我有一個XML/RSS文件,如:

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:wp="http://wordpress.org/export/1.0/" 
> 
<channel> 
    <title>sometitle</title> 
    <pubDate>Tue, 28 Aug 2012 22:36:02 +0000</pubDate> 
    <generator>http://wordpress.org/?v=2.5.1</generator> 
    <language>en</language> 
    <wp:wxr_version>1.0</wp:wxr_version> 
    <wp:category><wp:category_nicename>apache</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Apache]]></wp:cat_name></wp:category> 
</channel> 
</rss> 

但是,當我試圖找到所有:通過做 「WP類別」 標籤:

import xml.etree.ElementTree as xml 
tree = xml.parse(fn) 
doc = tree.getroot() 
categories = doc.findall('channel/wp:category') 

我得到的錯誤:

SyntaxError: prefix 'wp' not found in prefix map 

搜索任何非名稱空間特定的字段工作得很好。我究竟做錯了什麼?

回答

1

您需要handle the namespace prefixes,可以通過使用iterparse並直接處理事件或在解析之前顯式聲明您感興趣的前綴。根據你想要做什麼,我會承認在我懶惰的時刻,我只是在解析XML之前將所有前綴與字符串替換掉。

編輯:this similar question might help.

+1

這沒有任何意義。名稱空間前綴在父代標記中定義。我不應該預先解析我的RSS文檔,所以我可以將命名空間提供給我的RSS解析器... – Cerin

+0

我不會和你爭論,我只是說我是這麼解決的。 – Tom