Trabajo con ficheros xml
De WikiEducator
Amara
- http://wiki.xml3k.org/Amara (Tutorial)
- Tiene dos interfaces:
-
Una muy rápida y con una sintaxis más cercana al xml
import amara URL = '....' # URL puede ser una url, una ruta de un fichero o una cadena de texto doc = amara.parse(URL)
-
Otra más amigable y fácil de utilizar, que convierte el xml en objetos python.
from amara import bindery URL = '....' doc = bindery.parse(URL)
# si el html o xml puede no ser válido: from amara.bindery import html URL = '....' doc = html.parse(URL)
Instalar
Para instalar la última versión:
$ pip install -i http://pypi.zepheira.com/releases/index Amara
O descargar, descomprimir y ejecutar dentro del directorio de amara:
$ python setup.py install
Tip: Es necesario tener instalado un compilador de C y la cabeceras de python (en debian/ubuntu hay que instalar python-dev
Algunos ejemplos de uso
Del manual de Amara: http://wiki.xml3k.org/Amara/Tutorial#The_XML_bindery
Uso básico: recorrer nodos.
from amara import bindery MONTY_XML = """<monty> <python spam="eggs">What do you mean "bleh"</python> <python ministry="abuse">But I was looking for argument</python> </monty>""" doc = bindery.parse(MONTY_XML) m = doc.monty p1 = doc.monty.python #or m.python; p1 is just the first python element print print p1.xml_attributes[(None, u'spam')] print p1.spam for p in doc.monty.python: #The loop will pick up both python elements p.xml_write()
Ejemplo con uso de groupby
from amara import bindery MONTY_XML = """<quotes> <quote skit="1">This parrot is dead</quote> <quote skit="2">What do you mean "bleh"</quote> <quote skit="2">I don't like spam</quote> <quote skit="3">But I was looking for argument</quote> </quotes>""" doc = bindery.parse(MONTY_XML) q1 = doc.quotes.quote # or doc.quotes.quote[0] print q1.skit print q1.xml_attributes[(None, u'skit')] # XPath works too: q1.xml_select(u'@skit') for q in doc.quotes.quote: # The loop will pick up both q elements print unicode(q) # Just the child char data from itertools import groupby from operator import attrgetter skit_key = attrgetter('skit') for skit, quotegroup in groupby(doc.quotes.quote, skit_key): print skit, [ unicode(q) for q in quotegroup ]