Trabajo con ficheros xml

De WikiEducator
Saltar a: navegación, buscar


Amara

  • 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
Icon present.gif
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 ]