• Publicidad

Consulta sobre 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.

Re: Consulta sobre HTML::TableExtract

Notapor explorer » 2013-12-16 18:38 @818

En las comillas. Has escrito esta expresión:

"http://atudem.org/?option=com_partenieve&task=view&fecha=" $fecha "#parte"

He separado la variable de las comillas que la rodean para que lo veas más claro. El problema es que Perl no sabe qué hacer con dos cadenas de caracteres con una variable en medio.

Esa expresión sí es válida en otros lenguajes informáticos, pero no en Perl, que requiere la presencia de un operador, para saber qué hacer con esos tres elementos.

Lo que querías haber escrito es esto:

"http://atudem.org/?option=com_partenieve&task=view&fecha=" . $fecha . "#parte"

El operador '.' es el de concatenación de cadenas de caracteres.

De todas maneras, como las cadenas que intervienen no tienen caracteres extraños, también lo puedes escribir así:

"http://atudem.org/?option=com_partenieve&task=view&fecha=$fecha#parte"

Con las comillas dobles, Perl interpola todo aquello que parece una variable, así que $fecha cambiará a su valor.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Consulta sobre HTML::TableExtract

Notapor enric73 » 2013-12-17 12:46 @574

Gracias, explorer.

Tengo una duda más, y prefiero exponerla aquí y no abrir ningún hilo porque supongo que no será necesario.

Tengo un fichero csv que normalmente (se genera por la combinación de varios csv) presenta una salto de línea al final y con el siguiente código resuelvo el problema y elimino el salto.

Pero a veces, aparecen dos o más saltos de línea al final del fichero. ¿Cómo puedo eliminar todos los saltos de línea que aparecen al final del fichero?, ¿se pueden detectar?

Este código elimina el salto de línea que aparece al final del fichero, pero si hay dos o más saltos de línea al final del fichero no me los elimina, solamente uno.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use autodie;
  3.  
  4. chdir "/home/enric/dades/csv/";
  5. my $archivo = 'estacions';
  6. open my $INFILE, '<', "$archivo.csv";  
  7. my @archivo = <$INFILE>;
  8. chomp $archivo[-1];
  9. close $INFILE;
  10.    
  11. #my $primera = $archivo[0];                    
  12.    
  13. open my $OUTFILE, '>', "${archivo}.csv";  
  14. print   $OUTFILE @archivo;                    
  15. close   $OUTFILE;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Gracias
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Consulta sobre HTML::TableExtract

Notapor explorer » 2013-12-17 14:17 @637

Se puede meter a chomp() en un bucle, y así quitamos todos. O una expresión regular. Depende un poco del tamaño del archivo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use autodie;
  3.  
  4. my $nombre = '/home/enric/dades/csv/estacions.csv';
  5.  
  6. open my $INFILE, '<', $nombre;
  7. undef $/;                            # modo aspiradora
  8. my $archivo = <$INFILE>;             # ¡shhhuuuuuup!
  9. close   $INFILE;
  10.  
  11. #1 while chomp $archivo;             # menos efectivo que la expresión regular
  12. $archivo =~ s/[\r\n]+$//;            # quitar los últimos caracteres de avance de línea y retorno de carro
  13.  
  14. open my $OUTFILE, '>', $nombre;
  15. print   $OUTFILE "$archivo\n";
  16. close   $OUTFILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con un Perl moderno, se puede reescribir la expresión regular con un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $archivo =~ s/\s+$//a;               # quitar los últimos caracteres "blancos" del final de línea
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

"\s" coincide con los 5 caracteres [\t\n\f\r ] (extraído de perlrecharclass).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre HTML::TableExtract

Notapor enric73 » 2013-12-18 14:13 @634

Gracias, explorer.

He solucionado el tema del salto de línea y retorno de carro.

Sin embargo, sigo con el problema de la fecha.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use autodie;
  2. use utf8::all;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use Time::Local;
  7. use Class::Date qw(date now);
  8.  
  9.  
  10. use POSIX qw(strftime);
  11. my $fecha = print strftime "%d-%m-%Y", localtime;
  12. use LWP::Simple;
  13. my $html = get("http://atudem.org/?option=com_partenieve&task=view&fecha=".$fecha."#parte");  
  14. print "http://atudem.org/?option=com_partenieve&task=view&fecha=".$fecha."#parte";  
  15. #my $html = get(" http://atudem.org/?option=com_parteniev ... 2013#parte");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aparece el siguiente error, imprime bien por pantalla la fecha (18-12-2013), pero cuando tiene que colocarla dentro de my $html, ¡no funciona! ¿A qué es debido?
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ ./atu.pl
  2. 18-12-2013
  3. Can't call method "rows" on an undefined value at ./atu.pl line 26 (#1)
  4.    (F) You used the syntax of a method call, but the slot filled by the
  5.    object reference or package name contains an undefined value.  Something
  6.    like this will reproduce the error:
  7.    
  8.        $BADREF = undef;
  9.        process $BADREF 1,2,3;
  10.        $BADREF->process(1,2,3);
  11.    
  12. Uncaught exception from user code:
  13.        Can't call method "rows" on an undefined value at ./atu.pl line 26.
  14.  at ./atu.pl line 26.
  15. http://atudem.org/?option=com_parteniev ... #partebash
  16.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Consulta sobre HTML::TableExtract

Notapor explorer » 2013-12-18 14:28 @645

No sé dónde puede estar ese 'rows'. No lo veo por ninguna parte. Dice que el error está en la línea 26, pero el código solo tiene 15.

Prueba a cambiar las comillas dobles por simples.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta sobre HTML::TableExtract

Notapor enric73 » 2013-12-18 15:00 @666

Hola, explorer.

Tampoco me ha funcionado. Si pongo directamente la fecha de hoy sí que me baja los datos correctamente, pero si utilizo $fecha, no...

Este es el código que utilizo. Hay bastantes líneas comentadas porque me ayudan a encontrar cada variable que deseo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use v5.10;
  3. use autodie;
  4. use utf8::all;
  5. use strict;
  6. use warnings;
  7. use diagnostics;
  8. use Time::Local;
  9. use Class::Date qw(date now);
  10.  
  11.  
  12. use POSIX qw(strftime);
  13. my $fecha = print strftime "%d-%m-%Y\n", localtime;
  14. use LWP::Simple;
  15. my $html = get("http://atudem.org/?option=com_partenieve&task=view&fecha='.$fecha.'#parte");  
  16. print "http://atudem.org/?option=com_partenieve&task=view&fecha=".$fecha."#parte";  
  17. #my $html = get(" http://atudem.org/?option=com_parteniev ... 2013#parte");      
  18. my $output_file = '/home/enric/csv/atu.csv';
  19.    
  20. ## Interpretació del contingut
  21. use HTML::TableExtract;
  22. my $te = HTML::TableExtract->new();
  23. $te->parse($html);
  24. my @tables = $te->tables;
  25.  
  26. my @rows = $tables[0]->rows;
  27. #shift @rows;                                                  
  28. #my @values = map { $_->[1],$_->[2],$_->[3],$_->[4], $_->[5]} @rows;  
  29. my @values = map { $_->[0],$_->[1],$_->[3],$_->[5],$_->[7],$_->[8],$_->[9],$_->[10]} @rows;  
  30.  
  31.  
  32.  
  33. #my @values = map { $_->[3]} @rows;
  34. #print "$values[96]"; #nom astun
  35. #print "$values[97]"; #remonts astun
  36. #print "$values[98]"; #pistes astun
  37. #print "$values[99]"; #kilometres astun
  38. #print "$values[100]"; #gruix min astun
  39. #print "$values[101]"; #gruix max astun  
  40. #print "$values[102]"; #tipus neu astun
  41. #print "$values[103]"; #observacions astun
  42.  
  43.  
  44. #print "$values[104]"; #nom candanchu
  45. #print "$values[105]"; #remonts candanchu
  46. #print "$values[106]"; #pistes candanchu
  47. #print "$values[107]"; #kilometres candanchu
  48. #print "$values[108]"; #gruix min candanchu
  49. #print "$values[109]"; #gruix max candanchu  
  50. #print "$values[110]"; #tipus neu candanchu
  51. #print "$values[111]"; #observacions candanchu
  52.  
  53. #print "$values[112]"; #nom cerler
  54. #print "$values[113]"; #remonts cerler
  55. #print "$values[114]"; #pistes cerler
  56. #print "$values[115]"; #kilometres cerler
  57. #print "$values[116]"; #gruix min cerler
  58. #print "$values[117]"; #gruix max cerler  
  59. #print "$values[118]"; #tipus neu cerler
  60. #print "$values[119]"; #observacions cerler
  61.  
  62. #print "$values[120]"; #nom formigal
  63. #print "$values[121]"; #remonts formigal
  64. #print "$values[122]"; #pistes formigal
  65. #print "$values[123]"; #kilometres formigal
  66. #print "$values[124]"; #gruix min formigal
  67. #print "$values[125]"; #gruix max formigal  
  68. #print "$values[126]"; #tipus neu formigal
  69. #print "$values[127]"; #observacions formigal
  70.  
  71. #print "$values[136]"; #nom panticosa
  72. #print "$values[137]"; #remonts panticosa
  73. #print "$values[138]"; #pistes panticosa
  74. #print "$values[139]"; #kilometres panticosa
  75. #print "$values[140]"; #gruix min panticosa
  76. #print "$values[141]"; #gruix max panticosa  
  77. #print "$values[142]"; #tipus neu panticosa
  78. #print "$values[143]"; #observacions panticosa
  79.  
  80. #print "$values[168]"; #nom boi
  81. #print "$values[169]"; #remonts boi
  82. #print "$values[170]"; #pistes boi
  83. #print "$values[171]"; #kilometres boi
  84. #print "$values[172]"; #gruix min boi
  85. #print "$values[173]"; #gruix max boi  
  86. #print "$values[174]"; #tipus neu boi
  87. #print "$values[175]"; #observacions boi
  88. my @values2 = ('409',$values[96], $values[103],'-', $values[102], $values[100], $values[101], $values[97], $values[98], arregla($values[99]));
  89. my @values3 = ('1258',$values[104], $values[111],'-', $values[110], $values[108], $values[109], $values[105], $values[106], arregla($values[107]));
  90. my @values4 = ('412',$values[112], $values[119],'-', $values[118], $values[116], $values[117], $values[113], $values[114], arregla($values[115]));
  91. my @values5 = ('410',$values[120], $values[127], '-', $values[126], $values[124], $values[125],$values[121], $values[122], arregla($values[123]));
  92. my @values6 = ('411',$values[136], $values[143], '-', $values[142], $values[140], $values[141],$values[137], $values[138], arregla($values[139]));
  93. my @values7 = ('413',$values[168], $values[175],'-', $values[174], $values[172], $values[173], $values[169], $values[170], arregla($values[171]));
  94.  
  95. #my $neu = $values[3];
  96. my @titles = qw(ID ESTACIO ESTAT ACCES NEU GRUIX.MIN GRUIX.MAX REMUNTADORS PISTES KM);    
  97. open my $fh, ">:encoding(utf8)", $output_file or die $!;
  98. use Text::CSV;
  99. my $csv = Text::CSV->new ({
  100. binary => 1,
  101. eol    => $/,
  102. });
  103. #$csv->print( \*STDOUT, \@titles );
  104. #$csv->print( \*STDOUT, \@values2 );
  105. #$csv->print( \*STDOUT, \@values3 );
  106. #$csv->print( \*STDOUT, \@values4 );
  107. #$csv->print( \*STDOUT, \@values5 );
  108. #$csv->print( \*STDOUT, \@values6 );
  109. #$csv->print( \*STDOUT, \@values7 );
  110. $csv->print( $fh, \@titles);                              
  111. $csv->print( $fh, \@values2 );
  112. $csv->print( $fh, \@values3 );
  113. $csv->print( $fh, \@values4 );
  114. $csv->print( $fh, \@values5 );
  115. $csv->print( $fh, \@values6 );
  116. $csv->print( $fh, \@values7 );
  117.  
  118. close $fh;
  119. ### Subrutines
  120. sub arregla {
  121. my $txt = shift;
  122. if (defined $txt) {                                        
  123. $txt = lc($txt);
  124. $txt =~ s/,/./g;
  125. }
  126. return $txt;
  127. }
  128.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Consulta sobre HTML::TableExtract

Notapor explorer » 2013-12-18 16:44 @738

La línea 13 está mal. Es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $fecha = strftime "%d-%m-%Y", localtime;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Prueba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use autodie;
  8. use utf8::all;
  9. use LWP::Simple;
  10. use POSIX qw(strftime);
  11. use HTML::TableExtract;
  12.  
  13. my $fecha = strftime "%d-%m-%Y", localtime;
  14. my $url   = "http://atudem.org/?option=com_partenieve&task=view&fecha=$fecha#parte";
  15. my $html  = get($url);  
  16.  
  17. ## Interpretació del contingut
  18. my $te = HTML::TableExtract->new();
  19. $te->parse($html);
  20. my @tables = $te->tables;
  21.  
  22. my @rows = $tables[0]->rows;
  23. my @values = map { @{$_}[0..10] } @rows;
  24.  
  25. use Data::Dumper;
  26. say Dumper \@values;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados