• Publicidad

HTML::TableExtract

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

HTML::TableExtract

Notapor natxo » 2008-10-28 05:13 @259

Hola:

Estoy intentando convertir tasas de cambio de moneda mediante xe.com y tengo un problema a la hora de extraer los datos de una tabla

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1 #!/usr/bin/perl
  2 use strict;
  3 use warnings;
  4 use LWP::UserAgent;
  5 use HTML::TableExtract;
  6
  7 unless ( @ARGV == 3 ) {
  8
  9     print "usage: $0 amount from to\n";
 10     print "    example: $0 1000 usd eur\n";
 11     exit( 1 );
 12 }
 13
 14 my ( $amount, $from, $to ) = @ARGV;
 15    
 16 my $user_agent = LWP::UserAgent->new( agent => 'Mozilla/5.0' );
 17
 18 my $response = $user_agent->post(
 19
 20     'http://www.xe.com/ucc/convert.cgi', [
 21
 22         Amount => $amount,
 23         From   => uc $from,
 24         To     => uc $to,
 25     ]
 26 );
 27
 28 $response->is_success or
 29     die $response->status_line;
 30
 31 my $html_file = $response->content;
 32
 33 my $percent = "45%";
 34 my $table_extract = HTML::TableExtract->new( attribs => { width => $percent } );
 35 $table_extract->parse($html_file);
 36 foreach my $tabla ($table_extract->tables) {
 37         foreach my $fila ($tabla->rows) {
 38                     print " ", join(', ', @$fila), "\n";
 39                         }
 40 }
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El problema es que no sale nada. Mirando en el código de la página que devuelve xe.com veo que la tabla tiene esta estructura:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <tr> 
  2.  
  3. <td height="40" colspan="3" align="center" class="XEenlarge"> 
  4. <span class="XEsmall">Live rates at 2008.10.28 08:56:16 UTC</span> 
  5. </td> 
  6. </tr> 
  7. <tr> 
  8. <td width="45%" align="right" class="XEenlarge"><h2 class="XE">1,500.00 EUR<!-- WARNING: Automated extraction of data is prohibited under the Terms of Use. --></h2></td> 
  9. <td valign="top" align="center" class="XEenlarge"><h2 class="XE">=</h2></td> 
  10.  
  11. <td width="45%" align="left" class="XEenlarge"><h2 class="XE">1,874.66 USD<!-- WARNING: Automated extraction of data is prohibited under the Terms of Use. --></h2></td> 
  12. </tr> 
  13. <tr> 
  14. <td align="right" class="XEenlarge">Euro 
  15. </td> 
  16. <td valign="top" align="center" class="XEenlarge">&nbsp;</td> 
  17. <td align="left" class="XEenlarge">United States Dollars 
  18. </td> 
  19. </tr> 


En mi código busco el atributo 'width' y no saco nada. En cambio si busco align => 'right' entonces sí salen más cosas. Obviamente me interesa el width="45%".

También he probado esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $table_extract = HTML::TableExtract->new( headers => [qw(Euro)]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl kk.pl 200 usd eur
 1 EUR = 1.24903 USD
Use of uninitialized value $fila in join or string at kk.pl line 39.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Como veis, me da la tasa de cambio de un dólar, no lo que había pedido. En fin, es mejor que nada y puedo modificar eso y multiplicarlo por el primer argumento del programa, pero lo suyo sería extraer la tabla directamente.

Sí, ya sé que no se deberían extraer los datos, pero si los puedo ver en la pantalla con un navegador, no veo por qué no puedo hacer lo mismo con otro navegador (LWP); además digamos, que esto es para usos educacionales ;-)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Notapor explorer » 2008-10-28 10:34 @482

Yo he usado, como rasgo distintivo, la clase de la tabla:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use LWP::UserAgent;
use HTML::TableExtract;
use Encode;

unless ( @ARGV == 3 ) {
    print "usage: $0 amount from to\n";
    print "    example: $0 1000 usd eur\n";
    exit  1;
}

my ( $amount, $from, $to ) = @ARGV;

my $user_agent = LWP::UserAgent->new( agent => 'Mozilla/5.0' );

my $response = $user_agent->post(
    'http://www.xe.com/ucc/convert.cgi',
    [
        Amount => $amount,
        From   => uc $from,
        To     => uc $to,
    ]
);

$response->is_success or
    die $response->status_line;

my $html_file = decode_utf8($response->content);

my $table_extract = HTML::TableExtract->new( attribs => { class => 'XEtbl_sub' } );

$table_extract->parse($html_file);

my @tablas = $table_extract->tables();
my $tabla  = $tablas[0];                ## Es la primera tabla
my @filas  = $tabla->rows;              ## Sacamos todas las filas de esa tabla

## De la tercera fila, sacamos todas las celdas
print join(' ', @{$filas[2]}),"\n";

## Esta es otra forma, accediendo directamente al contenido de la $tabla
print join(' ', map { $_ = $$_ } @{ $tabla->{grid}->[2] }), "\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Fíjate que también le he añadido el módulo Encode para parsear los caracteres utf8. Si no, saldría un aviso en pantalla.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor natxo » 2008-10-28 10:51 @494

wow :-)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron