Extracción de información de html

De WikiEducator
Saltar a: navegación, buscar


Lectura de una página html

El proceso básico consiste en utilizar un parser para analizar el documento. Amara tiene 3 parsers:

amara.parse
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.



Icon activity.jpg

Actividad

Escribe este ejemplo para leer un documento. Modifica URL para que tenga una dirección real. ¿Qué vemos en la pantalla?

  1. from amara.bindery import html
  2. URL = 'http://pagina.destino.com'
  3.  
  4. doc = html.parse(URL)
  5. print doc
Icon present.gif
Tip: doc tiene toda la información del documento






Búsqueda con xpath

  1. doc = html.parse(URL)
  2. encontrados = doc.xml_select(<expresión xpath>)
  3. for elemento in encontrados:
  4.     <tratar_elemento>

Búsqueda de las imágenes de un artículo

>>> from amara.bindery import html
>>> 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
...

Búsqueda de las entradas de una revista

Barrapunto publica sus entradas como

<div class="article">
<div class="generaltitle">
	<div class="title">
		<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>

Para extraer los nombres de los artículos de la primera página:

>>> from amara.bindery import html
>>> from amara.lib import U  # Extrae los nodos de texto de un fragmento
>>> articulos = doc.xml_select(u'//div[@class="article"]')
>>> 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 20os de Linux
Publicado SmartOS, sistema operativo basado en Illumos
Un dispositivo permite a los invidentes ver a través de su lengua
El fin de la ley de Moore
...

Más ejemplos en http://wiki.xml3k.org/Amara/Recipes

Expresiones XPATH útiles

# Nodo que contenga una cadena de texto:
expresion = u'.//text()[contains(., "python")]'
expresion = u'.//text()[contains(., "%s")]' % cadena.decode('utf-8')
# Nodos o atributos que contengan una cadena:
expresion = expr = u'.//@*[contains(., "%s")]'

Más

Icon present.gif
Tip: Más info: http://es.wikieducator.org/LSWC_scraping_the_web/taller_scraping_lwsc_2011