Búsqueda en formularios con post y autentificación

El siguiente ejemplo muestra como acceder a una página protegida bajo autentificación (básica), hacer una búsqueda a través de un formulario post y analizar los resultados.

Como ejemplo usaremos las páginas de búsqueda en el servidor de gestión integral de la Escuela Superior de Ingeniería Informática de la Universidad de La Laguna: http://w4.csi.ull.es/personal/cabecera.php3.

Lo primero es que nos pedirá autentificarnos. Observe bien el realm (Autentificacion).

Una vez atravesada la fase de autentificación, el formulario a rellenar es como sigue:

<form method="POST" action="busqueda.php3" target="pie" name="formu">
  <table width=50% cellspacing="0" cellpadding="0" border=0 bgcolor="#DEDEDE">
    <tr><td>Texto a buscar : <input type=text name=TEXTO size=10></td>
    <td><input type=submit value="Buscar"> </td></tr>
  </table>
</form>

Y la salida tiene este aspecto:

<table  cellspacing=3  cellpadding=3 width=90% align=center>
  <tr>
     <td bgcolor="#CBCCEB" width=60%><font size=+1><b>Nombre</b></font></td>
     <td bgcolor="#CBCCEB"><font size=+1><b>Username</b></font></td>
     <td bgcolor="#CBCCEB"><font size=+1><b>Departamento</b></font></td>
  </tr>
  <tr>
     <td><a href="info.php3?USER=fabiano" >RODRIGUEZ GIL, FABIANO</a></td>
     <td>fabiano</td><td>ESTADÍSTICA, I.O. y C.</td>
  </tr>
</table>
<table  cellspacing=3  cellpadding=3 width=70% align=center>
  <tr bgcolor="#CBCCEB">
     <td><font size=+1><b>Username</b></font></td>
     <td width=65%><font size=+1><b>Nombre</b></font></td></tr>
  <tr>
     <td><a href="mailto:fabiano@etsii.ull.es">fabiano</a></td>
     <td>Casiano Rodriguez Gil</td>
   </tr>
   <tr>
     <td><a href="mailto:call@etsii.ull.es">call</a></td>
     <td>Proyecto de German con Fabiano</td></tr>
</table>
Obsérvese que contiene dos tablas (no siempre).

Sigue una solución:

#! /usr/bin/perl -w

use strict;
use LWP::UserAgent;
use HTML::TreeBuilder 3;

die "Uso $0 \"nombre\"\n" unless @ARGV == 1; 
my $name = $ARGV[0]; 
 
my $browser = LWP::UserAgent->new;

$browser->credentials(
'w4.etsii.ull.es:80',
'Autentificacion',
'alu999'=>'alu999password'
);

my $response = $browser->post(
  'http://w4.etsii.ull.es/personal/busqueda.php3',
  ['TEXTO'=>$name] 
);
die "Error: ", $response->status_line unless $response->is_success; 

my $root = HTML::TreeBuilder->new_from_content($response->content);
my @rows = $root->find_by_tag_name('tr');

foreach my $n (@rows) {
  my @fields = $n->find_by_tag_name('td');
  foreach my $f (@fields) {
    print $f->as_trimmed_text(),"\t";
  }
  print "\n";
}

$root->delete;

Casiano Rodríguez León
2010-03-22