Diferencia entre revisiones de «LSWC scraping the web/taller scraping lwsc 2011»
Línea 58: | Línea 58: | ||
Vamos a usar ahora un ejemplo real: el listado de cursos de formación para el empleo del INAEM recogido en http://plan.aragon.es/MapaRec.nsf/fmrListado?OpenForm | Vamos a usar ahora un ejemplo real: el listado de cursos de formación para el empleo del INAEM recogido en http://plan.aragon.es/MapaRec.nsf/fmrListado?OpenForm | ||
{{Tip| Para el taller usaremos una copia local, para no saturar el servidor ;-) }} | {{Tip| Para el taller usaremos una copia local, para no saturar el servidor ;-) }} | ||
+ | |||
Para selecciones más complejas podemos usar expresiones XPATH. Si no sabes XPATH, firebug te puede ayudar. Firebug copia la XPATH a cualquier elemento. | Para selecciones más complejas podemos usar expresiones XPATH. Si no sabes XPATH, firebug te puede ayudar. Firebug copia la XPATH a cualquier elemento. | ||
− | + | [[Archivo:Copiar xpath.png]] | |
+ | |||
+ | === Listado de cursos=== | ||
+ | Observando el código fuente, vemos que los nombres de los cursos van en una celda con '''class="textoApl1"''': | ||
+ | <source lang="html4strict"> | ||
+ | <tr> | ||
+ | <td class="textoApl1" style="background-color: rgb(248, 247, 247);"> | ||
+ | <a class="enlaceApl1 pequena1 negrita" alt="Pulse para acceder al contenido del curso" title="Pulse para acceder al contenido del curso" href="/MapaRec.nsf/(ID)/B9666A70A2B596C7C125783A0029923D?OpenDocument">ACTIVIDADES ADMINISTRAT...RELACIÓN CON EL CLIENTE</a> | ||
+ | </td> | ||
+ | ... | ||
+ | </source> | ||
+ | La expresión xpath correspondiente es: | ||
+ | u'//table/tbody//tr' | ||
+ | |||
<source lang="python"> | <source lang="python"> | ||
from amara.bindery.html import parse | from amara.bindery.html import parse | ||
Línea 68: | Línea 82: | ||
doc = parse('lista_cursos_inaem.html') | doc = parse('lista_cursos_inaem.html') | ||
− | CURSOS = u'// | + | CURSOS = u'//table/tbody//tr' |
lista_cursos = doc.xml_select(CURSOS) | lista_cursos = doc.xml_select(CURSOS) | ||
− | for c in lista_cursos: | + | for c in lista_cursos[1:]: # la primera fila eran cabeceras!!! |
− | print c | + | print c.td |
+ | </source> | ||
+ | |||
+ | ¿Quieres más datos? | ||
+ | <source lang="python"> | ||
+ | print c.td.a.href # imprime la url (relativa) del curso | ||
+ | print c.td[4] # quinta columna: ciudad del curso | ||
+ | </source> | ||
+ | ¿Cursos que se celebran en Huesca? | ||
+ | <source lang="python"> | ||
+ | from amara.lib import U | ||
+ | |||
+ | for c in lista_cursos[1:]: # primera fila cabeceras | ||
+ | if U(c.td[4]) == u'Huesca': | ||
+ | print c.td | ||
</source> | </source> |
Revisión de 09:04 7 nov 2011
Contenido
Planteamiento del taller de scraping
En el taller vamos a usar Python y Amara para hacer una práctica de web scraping. El nivel del taller es de iniciación.
Configuración
Python y Amara son multiplataforma. En el taller vamos a indicar cómo instalar el entorno en linux.
$ sudo apt-get install python2.7 python2.7-dev python-pip idle-python2.7
$ sudo pip install http://files.akara.info/00-amara-latest.tar.bz2 Tip: Es necesario tener instalado un compilador de C y la cabeceras de python (en debian/ubuntu hay que instalar python-dev)
|
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 modifcar un documento web.
Vamos a practicar con un ejemplo muy sencillo, el ejemplo de la liga
Ejemplo | |
Lo primero que hay que hacer es ver la estructura del documento. Desde el navegador, accede al código fuente de la página web. Navegando al estilo Python
print doc.html.head.title
for liga doc.html.body.h2: print liga
for equipo in doc.html.body.ul.li: print equipo
|
Un ejemplo más complejo: análisis de los cursos de formación para el empleo
Vamos a usar ahora un ejemplo real: el listado de cursos de formación para el empleo del INAEM recogido en http://plan.aragon.es/MapaRec.nsf/fmrListado?OpenForm
Para selecciones más complejas podemos usar expresiones XPATH. Si no sabes XPATH, firebug te puede ayudar. Firebug copia la XPATH a cualquier elemento.
Listado de cursos
Observando el código fuente, vemos que los nombres de los cursos van en una celda con class="textoApl1":
<tr> <td class="textoApl1" style="background-color: rgb(248, 247, 247);"> <a class="enlaceApl1 pequena1 negrita" alt="Pulse para acceder al contenido del curso" title="Pulse para acceder al contenido del curso" href="/MapaRec.nsf/(ID)/B9666A70A2B596C7C125783A0029923D?OpenDocument">ACTIVIDADES ADMINISTRAT...RELACIÓN CON EL CLIENTE</a> </td> ...
La expresión xpath correspondiente es:
u'//table/tbody//tr'
from amara.bindery.html import parse doc = parse('lista_cursos_inaem.html') CURSOS = u'//table/tbody//tr' lista_cursos = doc.xml_select(CURSOS) for c in lista_cursos[1:]: # la primera fila eran cabeceras!!! print c.td
¿Quieres más datos?
print c.td.a.href # imprime la url (relativa) del curso print c.td[4] # quinta columna: ciudad del curso
¿Cursos que se celebran en Huesca?
from amara.lib import U for c in lista_cursos[1:]: # primera fila cabeceras if U(c.td[4]) == u'Huesca': print c.td