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
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 }
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.006 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:
- <tr>
- <td height="40" colspan="3" align="center" class="XEenlarge">
- <span class="XEsmall">Live rates at 2008.10.28 08:56:16 UTC</span>
- </td>
- </tr>
- <tr>
- <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>
- <td valign="top" align="center" class="XEenlarge"><h2 class="XE">=</h2></td>
- <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>
- </tr>
- <tr>
- <td align="right" class="XEenlarge">Euro
- </td>
- <td valign="top" align="center" class="XEenlarge"> </td>
- <td align="left" class="XEenlarge">United States Dollars
- </td>
- </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:
Using perl Syntax Highlighting
my $table_extract = HTML::TableExtract->new( headers => [qw(Euro)]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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.
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