2012-10-12 19 views
6

Come si cercano i tag specifici dello spazio dei nomi in XML usando Elementtree in Python?Parsing RSS con Elementtree in Python

Ho un documento XML/RSS come:

<?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> 

Ma quando provo e trovo tutti: tag "wp categoria" facendo:

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

ottengo l'errore:

SyntaxError: prefix 'wp' not found in prefix map 

La ricerca di campi non specifici dello spazio dei nomi funziona correttamente. Che cosa sto facendo di sbagliato?

risposta

1

È necessario handle the namespace prefixes, utilizzando iterparse e gestendo direttamente l'evento o dichiarando esplicitamente i prefissi a cui si è interessati prima di analizzare. A seconda di quello che stai cercando di fare, ammetterò nei momenti più pigri che spoglio tutti i prefissi con una stringa sostituita prima di analizzare l'XML.

MODIFICA: this similar question might help.

+1

Questo non ha senso. I prefissi dei namespace sono definiti nel tag genitore . Non avrei dovuto pre-analizzare il mio documento RSS solo così posso inserire i namespace nel mio parser RSS ... – Cerin

+0

Non sto litigando con te, sto solo dicendo che è così che mi sono aggirato. – Tom