• Publicidad

Dudas con HTML::Parser

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

Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-02 21:26 @934

Hola, estoy haciendo un pequeño script para consultar entradas en la RAE.

El método get() me devuelve el código de la página, el cual envío a un documento .html para después traducirlo usando el módulo HTML::Parser.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use LWP::Simple;
  5. use HTML::Parser;
  6. open(my $html, q[>], "index.html") or die("No se pudo abrir el archivo para escribir. $!");
  7. my $url = "http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=abyecto";
  8. my $codigo = get($url);
  9. print $html "$codigo";
  10. my $p = new HTML::Parser;
  11. $p->parse_file($html);
  12. $p->eof();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero no sé cómo tratar con los métodos de HTML::Parser, es decir, ¿cómo muestro en la consola el .html ya traducido?
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Publicidad

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-03 07:44 @364

¿A qué te refieres con lo de traducir? ¿A qué hay que traducir el HTML? ¿A XML?

HTML::Parser se basa en la definición de métodos que se disparan cuando el módulo encuentra cada marca HTML.
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: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-03 13:12 @591

Tal vez me he confundido con el propósito de HTML::Parser, explorer, lo que yo quiero es visualizar en la consola el texto traducido, es decir, solo texto plano.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
leo@lein:~$ rae abyecto
Real Academia Española. Diccionario Usual.
                 
            REAL               ACADEMIA           ESPAÑOLA
            DICCIONARIO DE LA LENGUA ESPAÑOLA - Vigésima segunda edición
abyecto, ta.
 (Del lat. abiectus, part. pas. de abiicĕre, rebajar, envilecer).

 1. adj. Despreciable, vil en extremo.
 2. adj. desus. humillado (‖ abatido en el orgullo).Real Academia Española © Todos los derechos reservados
leo@lein:~$
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-03 14:27 @644

En la propia distribución de HTML::Parser, en la carpeta eg/, viene un ejemplo llamado htext.pl, que hace justamente eso.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# perl .cpanplus/5.10.0/build/HTML-Parser-3.64/eg/htext rae.html


 
 
 
 
 
 
 
 
 
 
 Real Academia Española

 
 



 
 
 
 
 
 
   
       
       
       
       
       
         
           
             
             
             
             
             
             
             
             
   R

 EAL
   A CADEMIA  E SPAÑOLA

    Aviso legal

  



   Real Academia Española
   Asociación de
Academias de la Lengua Española
   Fundación pro Real Academia Española







           Diccionario
de la lengua española

                     
Vigésima segunda edición
         
  

           Diccionario
panhispánico de dudas

                       
   Primera edición
         
  


  
  

  V Congreso Internacional de la Lengua Española
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Atención: la página de la RAE está en codificación utf8, pero la salida del programa es en ISO-8859-1. Además, ves que la salida no está completa.

Otra solución es usar el mejor módulo para rascar páginas web, WWW::Mechanize:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
dv9810:~ # perl -MWWW::Mechanize -E '$mech = WWW::Mechanize->new(); $mech->get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=abyecto"); say $mech->content(format => "text")'
Wide character in print at -e line 1.
Real Academia Española. Diccionario Usual.    REAL  ACADEMIA  ESPAÑOLA    DICCIONARIO DE LA LENGUA ESPAÑOLA - Vigésima segunda ediciónabyecto, ta. (Del lat. abiectus, part. pas. de abiicĕre, rebajar, envilecer). 1.  adj. Despreciable, vil en extremo. 2.  adj. desus. humillado (‖ abatido en el orgullo).Real Academia Española © Todos los derechos reservados
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ahora ya tenemos todos los caracteres en utf8. De todas maneras, requiere un poco más de trabajo, para quedarnos con lo que nos interesa.
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: Dudas con HTML::Parser

Notapor erv-Z » 2010-04-03 14:38 @651

Una opción es abrirlo con ISO-8859-1, tenía un problema, porque al hacer la petición GET e imprimirlo el contenido en el archivo el script me respondía:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Wide Character....
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y pasé a abrir el archivo con utf8 como codificación predeterminada y no me respondió Wide character... También abres el archivo para escritura y luego lo tratas de leer, ábrelo para lectura y escritura.

Referencias:

Wide character
Funcion open()
ISO-8859-1


Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-03 15:05 @670

El mensaje de error "Wide character..." está explicado en el documento perlunifaq:

¿Qué es "carácter ancho"?

Este es un término usado tanto para los caracteres con un valor ordinal mayor de 127, como caracteres con un valor ordinal mayor de 255, como cualquier carácter que ocupe más de un byte, dependiendo del contexto.

El aviso Perl "Wide character in ..." está provocado por un carácter con un valor ordinal mayor de 255. Sin ninguna capa de codificación especificada, Perl intenta ajustar las cosas en ISO-8859-1 por razones de compatibilidad. Cuando no puede, emite este aviso (si los avisos están activados), y saca en su lugar los datos codificados en UTF-8.

Para evitar este aviso y evitar tener diferentes codificaciones en la salida en un solo flujo, siempre especificar una codificación, explícitamente, por ejemplo, con una capa PerlIO:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
binmode STDOUT, ":encoding(UTF-8)";
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

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-03 15:08 @672

Me he quedado con WWW::Mechanize:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Real Academia Española. Diccionario Usual.    REAL  ACADEMIA  ESPAÑOLA    DICCIONARIO DE LA LENGUA ESPAÑOLA - Vigésima segunda ediciónabyecto, ta. (Del lat. abiectus, part. pas. de abiicĕre, rebajar, envilecer). 1. adj. Despreciable, vil en extremo. 2. adj. desus. humillado (‖ abatido en el orgullo).Real Academia Española © Todos los derechos reservado 


Ahora solo tengo que asignar todo ese texto a una variable y en cada número hacer un salto de línea, y resolver lo del "Wide character".
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-03 15:11 @674

No había visto tu mensaje, explorer, y sí, funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new();
$mech->get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=abyecto");
my $string = $mech->content(format => "text");
binmode STDOUT, ":encoding(UTF-8)";
print "$string\n";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
leo@lein:~/Escritorio$ perl pl.pl
Real Academia Española. Diccionario Usual.    REAL  ACADEMIA  ESPAÑOLA    DICCIONARIO DE LA LENGUA ESPAÑOLA - Vigésima segunda ediciónabyecto, ta. (Del lat. abiectus, part. pas. de abiicĕre, rebajar, envilecer). 1.  adj. Despreciable, vil en extremo. 2.  adj. desus. humillado (‖ abatido en el orgullo).Real Academia Española © Todos los derechos reservados
leo@lein:~/Escritorio$
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora solo lo del salto de línea.

Edito:

He hecho esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use WWW::Mechanize;
  5. my $mech = WWW::Mechanize->new();
  6. $mech->get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=abyecto");
  7. my $string = $mech->content(format => "text");
  8. binmode STDOUT, ":encoding(UTF-8)";
  9. $string =~ s/(\d+)/\n$1/g;
  10. print "$string\n";
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Funciona a medias porque me sigue quedando pegado esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2.  adj. desus. humillado (‖ abatido en el orgullo).Real Academia Española © Todos los derechos reservados
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Edito:

He hecho esto y funciona bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use WWW::Mechanize;
  5. my $mech = WWW::Mechanize->new();
  6. $mech->get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=abyecto");
  7. my $string = $mech->content(format => "text");
  8. binmode STDOUT, ":encoding(UTF-8)";
  9. $string =~ s/(\d+)/\n$1/g;
  10. $string =~ s/\.(Real.*)/\n\n$1/g;
  11. print "$string\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Real Academia Española. Diccionario Usual.    REAL  ACADEMIA  ESPAÑOLA    DICCIONARIO DE LA LENGUA ESPAÑOLA - Vigésima segunda ediciónabyecto, ta. (Del lat. abiectus, part. pas. de abiicĕre, rebajar, envilecer).  
  2. 1. adj. Despreciable, vil en extremo.  
  3. 2. adj. desus. humillado (‖ abatido en el orgullo) 
  4.  
  5. Real Academia Española © Todos los derechos reservados 
Última edición por Leo_Gutierrez el 2010-04-03 15:27 @685, editado 1 vez en total
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor erv-Z » 2010-04-03 15:27 @685

Con esto basta para resolver lo de wide character:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(my $html, q[+>:encoding(UTF-8)], "index.html") or die("No se pudo abrir el archivo para escribir. $!");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Editado.
Última edición por erv-Z el 2010-04-03 15:29 @687, editado 1 vez en total
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-03 15:29 @687

erv-Z, gracias por tus respuestas, pero ya no estoy abriendo documentos html, estoy guardando todo en una cadena y desde ahí lo proceso; he usado esto para codificación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
binmode STDOUT, ":encoding(UTF-8)";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He estado editando mi último mensaje, para que vean allí los avances.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron