2012-10-12 110 views
6

¿Cómo se buscan las etiquetas específicas del espacio de nombres en XML usando Elementtree en Python?Analizando RSS con Elementtree en Python

tengo un documento XML/RSS como:

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

Pero cuando intento y encontrar todos: tags "wp categoría" haciendo:

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

me sale el error:

SyntaxError: prefix 'wp' not found in prefix map 

La búsqueda de cualquier campo no específico del espacio de nombres funciona bien. ¿Qué estoy haciendo mal?

Respuesta

1

Necesita handle the namespace prefixes, ya sea usando iterparse y manejando el evento directamente o declarando explícitamente los prefijos que le interesan antes de realizar el análisis. Dependiendo de lo que estés tratando de hacer, admitiré en mis momentos de flojedad que simplemente quité todos los prefijos con una cadena de reemplazo antes de analizar el XML.

EDIT: this similar question might help.

+1

Esto no tiene sentido. Los prefijos del espacio de nombres se definen en la etiqueta principal . No debería tener que analizar previamente mi documento RSS para que pueda alimentar con cuchara los espacios de nombres de mi analizador RSS ... – Cerin

+0

No discuto contigo, solo digo que así fue como lo solucioné. – Tom

Cuestiones relacionadas