Wednesday, April 30, 2014

"Parseo" de paginas html y el demo "oreilly-oscon2001"

El parseo de paginas web (de html puro) puede resultar muy util en muchos casos, el cambio de formato, el computo de datos, la creacion de graficas, etc, puede significar un ahorro de tiempo significativo.

En esta ocasion, quiero presentarles un demo que me parece de lo mas interesante, este viene instalado por defecto en la version de ActiveState llamada "baterias incluidas"

Para definir el punto de partida, veamos que version de Tcl tengo instalada en esta PC (con windows):

% info tclversion
8.4
% info patchlevel
8.4.20

Desde luego, eso tambien se puede saber desde que ves el prompt completo de la consola (lo cual quite' de la interaccion anterior por motivos de claridad):

(ActiveState ActiveTcl 8.4.20.0) 1 %

El demo "oreilly-oscon", se encuentra localizado en:
C:\Tcl\demos\Tcllib\oreilly-oscon2001
si es que instalaste Tcl/Tk en las opciones por defecto que te da el instalador.

En esa carpeta, se tienen los siguientes archivos:
oscon
osconwrap
README
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html

Primeramente, agregue' extensiones a los primeros 3 archivos para facilitar la asociacion con mi editor preferido (PSPad). quedaron asi:
oscon.tcl
osconwrap.txt
README.txt
sessions_friday.html
sessions_thursday.html
sessions_wednesday.html

El README.txt especifica:
* que depende de 6 librerias
  * tcllib htmlparse
  * tcllib struct matrix
  * tcllib struct tree
  * tcllib csv
  * tcllib report
  * tcllib log
* que genera 6 archivos (2 txt, 2 csv y 2 html) + 2 ps si se cuenta con "a2ps"
* que los archivos html fuente estan incluidos en este mismo directorio para evitar que el script deje de funcionar debido a que la pagina ya no este disponible, o esta haya cambiado de formato.

Debido a algunos cambios a partir de la version 2.0 de la libreria struct::tree,
http://tcllib.sourceforge.net/doc/struct_tree.html#SECTid82038b8
es necesario hacer algunas correcciones al script oscon. (el cual ahora lo tengo con extension tcl)

En resumen, los cambios son:
1) el comando de creacion de la estructura de arbol, tenia (por alguna razon que desconozco), lo siguiente:
::struct::tree::tree t
Es necesario dejarlo asi:
::struct::tree t
 
2) Hay que eliminar la opcion -key de los comandos "t get..."      

Esta es la lista de cambios (ya como deben quedar esas lineas):
#cambio #1
::struct::tree t
--
#cambio #2
set day  [escape [t get $day data]]
--
#cambio #3
set start [cvtdate [escape [t get [walkf $sess {0 0}] data]]]
#cambio #4
set track [string trim [escape [t get [walkf $sess {1 0}] data]]]
#cambio #5
set loc   [escape [t get [walkf $sess {1 1 0}] data]]
--
#cambio #6
set time    [escape [t get $talk data]]
--
#cambio #7
set title   [escape [t get [walkf $talk {0 0 0}] data]]
#cambio #8
set speaker [escape [t get [walkf $talk {0 2}] data]]
--
#cambio #9
set  tp  [$t get $n type]
--
#cambio #10
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([$t get $n data]...)"
--
#change #11
log::log debug "[textutil::strRepeat " " $d]$idx $tp ([string range [$t get $n data] 0 20]...)"

Ahora si, ya podemos lanzar el programa tal como se especifica en el archivo README.txt:

tclsh oscon.tcl wed sessions_wednesday.html

Al finalizar la ejecucion del script, los siguientes archivos seran creados:
wed.main.csv
wed.main.html
wed.main.ps
wed.main.txt
wed.sched.csv
wed.sched.html
wed.sched.ps
wed.sched.txt

Checalos, y comparalos contra la fuente (sessions_wednesday.html), para que veas lo que se puede hacer en termino de "parseo" y reformateo de la informacion.

Interesante, verdad?

No comments: