2011-02-27 13 views
5

Estoy tratando de usar lxml.etree para analizar un documento de exportación de Wordpress (es XML, algo así como RSS). Sólo estoy interesado en los mensajes publicados, así que estoy usando el siguiente bucle a través de mensajes publicados:.Etiquetas con: en nombre en lxml

for item in data.findall("item"): 
    if item.find("wp:post_type").text != "post": 
     continue 
    if item.find("wp:status").text != "publish": 
     continue 
    write_post(item) 

donde data es la etiqueta que todos los item etiquetas se encuentran en item etiquetas contienen mensajes, páginas, y borradores. Mi problema es que lxml no puede encontrar etiquetas que tengan un : en su nombre (por ejemplo, wp:post_type). Cuando intento item.find("wp:post_type") consigo este error:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "lxml.etree.pyx", line 1279, in lxml.etree._Element.find (src/lxml/lxml.e 
tree.c:38124) 
    File "/usr/lib64/python2.7/site-packages/lxml/_elementpath.py", line 210, in f 
ind 
    it = iterfind(elem, path) 
    File "/usr/lib64/python2.7/site-packages/lxml/_elementpath.py", line 200, in i 
terfind 
    selector = _build_path_iterator(path) 
    File "/usr/lib64/python2.7/site-packages/lxml/_elementpath.py", line 184, in _ 
build_path_iterator 
    selector.append(ops[token[0]](_next, token)) 
KeyError: ':' 

Asumo la KeyError : ':' se refiere a los dos puntos en el nombre de la etiqueta de ser válido. ¿Hay alguna forma de que pueda escapar del colon para que lxml encuentre la etiqueta correcta? ¿Tiene algún significado especial : en este contexto? ¿O estoy haciendo algo mal? Cualquier ayuda sería apreciada.

Respuesta

9

El : es un separador de espacio de nombres XML. Para escapar de los dos puntos en lxml, debe reemplazarlo con la URL del espacio de nombres entre llaves, como en item.find("{http://example.org/}status").text.

+0

Gracias, esto resolvió mi problema. –

Cuestiones relacionadas