Diferencia entre revisiones de «Usuario:Lmorillas/intropyaytozgz/xml»

De WikiEducator
Saltar a: navegación, buscar
(Búsqueda con xpath)
(Algunos ejemplos de uso)
 
(4 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
{{MiTitulo|Trabajo con ficheros xml / html}}
+
{{MiTitulo|Trabajo con ficheros xml}}
  
 
== Amara ==
 
== Amara ==
Línea 27: Línea 27:
 
=== Instalar ===
 
=== Instalar ===
 
Para instalar la última versión:
 
Para instalar la última versión:
  $ sudo pip install http://files.akara.info/00-amara-latest.tar.bz2
+
  $ pip install -i http://pypi.zepheira.com/releases/index Amara
  
 
O descargar, descomprimir y ejecutar dentro del directorio de amara:
 
O descargar, descomprimir y ejecutar dentro del directorio de amara:
  $ sudo python setup.py install
+
  $ 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'''}}
 
{{Tip| Es necesario tener instalado un compilador de C y la cabeceras de python (en debian/ubuntu hay que instalar '''python-dev'''}}
  
== Scraping con Amara ==
+
== Algunos ejemplos de uso ==
 +
Del manual de Amara: http://wiki.xml3k.org/Amara/Tutorial#The_XML_bindery
  
=== Lectura de una página html ===
+
'''Uso básico''': recorrer nodos.
El proceso básico consiste en utilizar un '''parser''' para analizar el documento. Amara tiene 3 parsers:
+
<source lang="python">
amara.parse
+
from amara import bindery
amara.bindery.parse
+
amara.bindery.html.parse
+
  
Para usar documentos html usaremos el tercero, que además soporta documentos no válidos (tagsoup). El objeto que devuelve el parser es el que usamos para leer y modificar un documento web.
+
MONTY_XML = """<monty>
 +
  <python spam="eggs">What do you mean "bleh"</python>
 +
  <python ministry="abuse">But I was looking for argument</python>
 +
</monty>"""
  
{{Actividad|
+
doc = bindery.parse(MONTY_XML)
Escribe este ejemplo para leer un documento. Modifica '''URL''' para que tenga una dirección real. ¿Qué vemos en la pantalla?
+
<source lang="python" line="GESHI_NORMAL_LINE_NUMBERS" >
+
from amara.bindery import html
+
URL = 'http://pagina.destino.com'
+
  
doc = html.parse(URL)
+
m = doc.monty
print doc
+
p1 = doc.monty.python #or m.python; p1 is just the first python element
</source>
+
print
{{Tip|'''doc''' tiene toda la información del documento}}
+
print p1.xml_attributes[(None, u'spam')]
}}
+
print p1.spam
  
=== Búsqueda con xpath ===
+
for p in doc.monty.python: #The loop will pick up both python elements
<source lang="python" line="GESHI_NORMAL_LINE_NUMBERS" >
+
    p.xml_write()
doc = html.parse(URL)
+
encontrados = doc.xml_select(<expresión xpath>)
+
for elemento in encontrados:
+
    <tratar_elemento>
+
 
</source>
 
</source>
  
====Búsqueda de las imágenes de un artículo====
+
Ejemplo con uso de '''groupby'''
 
<source lang="python">
 
<source lang="python">
>>> from amara.bindery import html
+
from amara import bindery
>>> URL = 'http://heraldo.es'
+
>>> doc = html.parse(URL)
+
>>> imagenes = doc.xml_select(u'//img') # las imágenes van en etiquetas img
+
>>> len(imagenes)
+
65
+
>>> primera_imagen = imagenes[0]
+
>>> print primera_imagen.xml_encode()
+
<img src="/MODULOS/global/publico/interfaces/img/logo-Heraldo.png" alt="Últimas noticias de Aragón, Zaragoza, Huesca y Teruel del periódico digital Heraldo.es"/>
+
>>> for im in imagenes:
+
        print im.src
+
/MODULOS/global/publico/interfaces/img/logo-Heraldo.png
+
/uploads/imagenes/iconos/titulos/jmj.jpg
+
/uploads/imagenes/rec70/_cuatrovientos6_011b2ad5.jpg
+
...
+
</source>
+
  
====Búsqueda de las entradas de una revista====
+
MONTY_XML = """<quotes>
Barrapunto publica sus entradas como
+
  <quote skit="1">This parrot is dead</quote>
<source lang="html4strict">
+
  <quote skit="2">What do you mean "bleh"</quote>
<div class="article">
+
  <quote skit="2">I don't like spam</quote>
<div class="generaltitle">
+
  <quote skit="3">But I was looking for argument</quote>
<div class="title">
+
</quotes>"""
<h3>
+
<a href="//softlibre.barrapunto.com/">Software Libre</a>: Todo listo para la celebración de los 20 años de Linux
+
+
</h3>
+
</div>
+
</div>
+
<div class="details">
+
...
+
</div>
+
...
+
</div>
+
</source>
+
Para extraer los nombres de los artículos de la primera página:
+
  
<source lang="python">
+
doc = bindery.parse(MONTY_XML)
>>> from amara.bindery import html
+
q1 = doc.quotes.quote # or doc.quotes.quote[0]
>>> from amara.lib import U  # Extrae los nodos de texto de un fragmento
+
print q1.skit
>>> articulos = doc.xml_select(u'//div[@class="article"]')
+
print q1.xml_attributes[(None, u'skit')] # XPath works too: q1.xml_select(u'@skit')
>>> len(articulos)
+
15
+
>>> for ar in articulos:
+
print U(ar.div).strip() # Navega por el nodo artículo.
+
                                # Cuidado con los espacios en blanco y saltos
+
  
Software Libre: Todo listo para la celebración de los 20 años de Linux
+
for q in doc.quotes.quote: # The loop will pick up both q elements
Publicado SmartOS, sistema operativo basado en Illumos
+
    print unicode(q) # Just the child char data
Un dispositivo permite a los invidentes ver a través de su lengua
+
El fin de la ley de Moore
+
...
+
</source>
+
  
'''Más ejemplos''' en http://wiki.xml3k.org/Amara/Recipes
+
from itertools import groupby
====Expresiones XPATH útiles====
+
from operator import attrgetter
<source lang="python">
+
 
# Nodo que contenga una cadena de texto:
+
skit_key = attrgetter('skit')
expresion = u'.//text()[contains(., "python")]'
+
for skit, quotegroup in groupby(doc.quotes.quote, skit_key):
expresion = u'.//text()[contains(., "%s")]' % cadena.decode('utf-8')
+
    print skit, [ unicode(q) for q in quotegroup ]
# Nodos o atributos que contengan una cadena:
+
expresion = expr = u'.//@*[contains(., "%s")]'
+
 
</source>
 
</source>
 
=== Más ===
 
{{Tip| '''Más info''': http://es.wikieducator.org/LSWC_scraping_the_web/taller_scraping_lwsc_2011}}
 

Última revisión de 02:23 11 dic 2012


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 ]