Friday, May 2, 2014

Un ejemplo de "parseo" con htmlparse

Para ejemplificar como "Lemon Tree Branch" puede ser usado como una herramienta para el parseo de paginas web, que mejor que tomar una página donde podrás encontrar excelentes scripts de los cuales puedes aprender lo mejor de las técnicas de programación usando Tcl/Tk. La página en cuestión es la correspondiente a Richard Suchenwirth en el wiki.
Primero, copié la dirección URL en la caja de texto destinada para ello.
Tuve que también "descomentar' las lineas siguientes en Lemon Tree Branch:

htmlparse::removeVisualFluff t
htmlparse::removeFormDefs t


Como se puede observar, la "ruta" a la lista de ejemplos de Richard es:
1-15-0, desde la raíz, hasta el primer tag


Ahora si, este es el programa ejemplo donde se pueden apreciar los beneficios de poder usar la funcionalidad de la estructura "tree", tal como por ejemplo:
t next $bulletIx
con lo cual se puede hacer iteraciones en elementos del mismo "nivel"



Nótese que:

  • Solo estoy "tomando" un solo link por "bullet", de modo que, por ejemplo, no estoy capturando el link para "A pocket Wiki", el cual es el segundo link en uno de los "bullets"



  • Hay un mensaje de error: (node "" does not exist in tree "t") cuando no hay link en el "bullet", como en "simplicite"






Obtener todos los links que haya por "bullet" puede ser un buen ejercicio para el lector.

console show
  
package require struct
package require htmlparse
package require http
  
proc parse {} {
  
::struct::tree t
  
set url "http://wiki.tcl.tk/1683"
set http  [::http::geturl $url]
set html  [::http::data $http]
  
htmlparse::2tree $html t
htmlparse::removeVisualFluff t
htmlparse::removeFormDefs t
  
set base [walk {1 15 0}]
    puts "data: [t get $base data]"
    puts "type(tag): [t get $base type]\n"
  
    set bulletIx   [walkf $base {0}]
  
while {$bulletIx != {}} {
      set link  [t get [walkf $bulletIx {0}]  data]
      #set title [t get [walkf $bulletIx {0 0}]  data]
      catch {t get [walkf $bulletIx {0 0}]  data} title
      puts "$link: $title"
      update
      set bulletIx [t next $bulletIx]
}
  
   t destroy
   return
}
  
proc walkf {n p} {
    foreach idx $p {
        if {$n == ""} {break}
        set n [lindex [t children $n] $idx]
    }
    return $n
}
  
proc walk {p} {
    return [walkf root $p]
}
  
parse

No comments: