• 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.

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-04 08:07 @380

RockoX escribiste:Una pregunta sobre el foro, ¿cómo puedo cambiar el nombre de mi usuario?

Mándame un mensaje privado, indicándome el nombre de usuario que quieres tener.

El problema con el programa Gtk es el siguiente: la función que se dispara al pulsar el botón de buscar, está creando una nueva etiqueta, cada vez:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 $label_mensaje = Gtk2::Label->new($rae);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y además, no la estás presentando al usuario.

La solución pasa por cambiar el texto de la etiqueta. Solo eso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 $label_mensaje->set_text($rae);
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-04 12:45 @573

Tienes razón, explorer, ha funcionado, mira:
Imagen

Ahora debo investigar sobre las scroll bars, dado que en entradas largas, por ejemplo "indio", se deforma la ventana, igual el botón, se hace gigantesco.

Este es el código que llevo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use WWW::Mechanize;
  5. use Gtk2 '-init';
  6. use constant TRUE => 1;
  7. use constant FALSE => 0;
  8.  
  9. sub raeSearch()
  10. {
  11.         my $mech = WWW::Mechanize->new();
  12.         $mech->get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
  13.         my $string = $mech->content(format => "text");
  14.        
  15.         $string =~ s/^.*?(?=1\.)//;
  16.         $string =~ s/(\d+\.)/\n$1/g;
  17.         $string =~ s/Real Academia.*$//;
  18.  
  19.         return $string;
  20. }
  21.  
  22. my $window = Gtk2::Window->new('toplevel');
  23. $window->set_border_width(100);
  24. $window->signal_connect(destroy => sub{Gtk2->main_quit});
  25.  
  26. my $label = Gtk2::Label->new("RAE Search.");
  27. my $button = Gtk2::Button->new("Buscar");
  28. my $vbox = Gtk2::VBox->new(5, FALSE);
  29. $vbox->add($label);    
  30. $vbox->pack_end($button, FALSE, FALSE, FALSE); 
  31. my $dir_entry = Gtk2::Entry->new;      
  32. $dir_entry->set_text("");      
  33.  
  34. $vbox->pack_start($dir_entry, FALSE, FALSE, FALSE);
  35. my $label_mensaje = Gtk2::Label->new("");
  36. my $rae;
  37. $button->signal_connect(clicked => sub
  38.         {
  39.                 $rae = $dir_entry->get_text;
  40.                 print "$rae\n";
  41.                 $label_mensaje->set_text(&raeSearch($rae));     # Llamada a la función.
  42.         }
  43. );
  44. $vbox->add($label_mensaje);
  45. $window->add($vbox);
  46. $window->show_all;
  47.  
  48. Gtk2->main;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Gracias por todo.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-04 13:54 @621

Muy bonito. Y el tema de Ubuntu me gusta :)

Por favor, revisa mi último código. Verás que con LWP::Simple obtendrás la función get(), de forma más rápida y cómoda que con WWW::Mechanize.
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

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-04 18:04 @795

Gracias por las respuestas, explorer.

Mira, tu último código lo he tratado así (agregué la función binmode() porque me daba el aviso de "wide character"):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use feature 'say';
  3. #use open 'locale';
  4. use LWP::Simple;
  5. binmode STDOUT, ":encoding(UTF-8)";
  6. sub Search()
  7. {
  8.         my $rae = get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
  9.         while ($rae =~ m/name="[\d_]+"> (.*?) <\/p/smgix)
  10.         {
  11.                 $desc = $1;
  12.                 # Quitar las marcas HTML
  13.                 $desc =~ s/<.*?>//gsm;
  14.                 # Quitar los espacios a los lados
  15.                 $desc =~ s/^\s+//sm;
  16.                 $desc =~ s/\s+$//sm;
  17.                 # Quitar espacios excesivos
  18.                 $desc =~ s/\s+/ /gsm;
  19.                 return "$desc";
  20.         }
  21. }
  22. print &Search("fortuito"), "\n";
  23.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la salida que me da es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
leo@lein:~/Escritorio$ perl simple.pl
abyecto, ta.
leo@lein:~/Escritorio$
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Es decir, si lo trato como función no me funciona bien, pero sí sin función.

He quitado estas líneas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use feature 'say';
use open 'locale';
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Porque Perl me estaba dando este aviso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate feature.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at simple.pl line 2.
BEGIN failed--compilation aborted at simple.pl line 2.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El say() lo cambié por un print(), pero igual, no me hace el trabajo, ¿se debe a las líneas que he comentado?

PD : He agregado las scroll bars a la interfaz, pero estoy teniendo problemas para unir las barras con el label.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor explorer » 2010-04-04 18:22 @807

El 'use open "locale" me resolvió lo del wide character, porque yo trabajo en mis máquinas con utf8, desde hace años.

El say() se activa con el 'feature', desde luego, pero solo si tienes el Perl v5.10. El mensaje de error dice que tienes un Perl v5.8.8, de hace ya unos años... ¡lástima!

El problema de la función está en el return().

Fíjate que lo has puesto dentro de un bucle while(). Eso quiere decir que en cuanto el while() encuentre la primera concordancia de la expresión regular, saldrá de la función. Por eso obtienes la línea de "abyecto", pero no las restantes: el bucle while() salió por el return() y no siguió buscando más concordancias.

Puedes hacer lo siguiente: crea una variable local, dentro de la función, que vaya almacenando lo que la expresión regular va encontrando, para luego devolverlo todo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $resultado;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $resultado .= "$desc\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     return $resultado;
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dudas con HTML::Parser

Notapor Leo_Gutierrez » 2010-04-04 18:28 @811

Jaja, qué tonto fui, no vi que estaba dentro del while(), en seguida lo resuelvo.
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-04 19:47 @865

He rediseñado la interfaz, porque estaba muy desorganizado, también agregué un frame, queda así ahora:

http://img94.imageshack.us/img94/411/pantallazo2j.png
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use LWP::Simple;
  5. use Gtk2 '-init';
  6. use constant TRUE => 1;
  7. use constant FALSE => 0;
  8.  
  9. binmode STDOUT, ":encoding(UTF-8)";
  10.  
  11. sub raeSearch()
  12. {
  13.         my $rae = get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
  14.         my $resultado;
  15.         while ($rae =~ m/name="[\d_]+"> (.*?) <\/p/smgix)
  16.         {
  17.                 my $desc = $1;
  18.                 # Quitar las marcas HTML
  19.                 $desc =~ s/<.*?>//gsm;
  20.                 # Quitar los espacios a los lados
  21.                 $desc =~ s/^\s+//sm;
  22.                 $desc =~ s/\s+$//sm;
  23.                 # Quitar espacios excesivos
  24.                 $desc =~ s/\s+/ /gsm;
  25.                 $resultado .= "$desc\n";
  26.         }
  27.                 return $resultado;
  28. }
  29.  
  30. # Propiedades de ventana:
  31. my $window = Gtk2::Window->new('toplevel');
  32. $window->set_title("Rae Search");
  33. $window->set_border_width(3);
  34. $window->signal_connect(destroy => sub{Gtk2->main_quit});
  35.  
  36. # Frame:
  37. my $frame = Gtk2::Frame->new("Entrada");
  38.  
  39. # VBox:
  40. my $vbox = Gtk2::VBox->new(FALSE, 6);
  41. $vbox->pack_start($frame, TRUE, TRUE, 0);
  42.  
  43. # HBox:
  44. my $hbox = Gtk2::HBox->new(FALSE, 6);
  45.  
  46. # Entry:
  47. my $dir_entry = Gtk2::Entry->new_with_max_length(30);
  48. $dir_entry->set_text("encono");
  49.  
  50. # Label:
  51. my $label_mensaje = Gtk2::Label->new("");
  52.  
  53. # Button
  54. my $button = Gtk2::Button->new("_Buscar");
  55. $button->signal_connect(clicked => sub
  56.         {
  57.                 $label_mensaje->set_text(&raeSearch($dir_entry->get_text));
  58.         }
  59. );
  60. $vbox->pack_end($label_mensaje, TRUE, TRUE, 0);
  61.  
  62. $frame->add($hbox);
  63.  
  64. $hbox->pack_start($dir_entry, FALSE, FALSE, 0);
  65. $hbox->pack_start($button, FALSE, FALSE, 0);
  66.  
  67. $window->add($vbox);
  68. $window->show_all;
  69. Gtk2->main;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Igual sigo teniendo este problema con entradas que den bastante texto:
http://img100.imageshack.us/img100/5939/pantallazo3s.png

Voy a incorporar las scroll bars, a ver como me va, ojalá y no haya problemas.

Edito: He agregado un icono, pero aún sigo con el problema de las scroll bars.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Me rindo.

Notapor Leo_Gutierrez » 2010-04-04 22:37 @984

Me rindo, no puedo incorporar el label a las scroll bars. :(

Llevo horas intentándolo y no puedo, ¿alguien me podría dar una mano?

¿O podría usar otra cosa en vez de label?

Edito:

Hay un widget que se llama "TextView", voy a ver si puedo incorporarlo.
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-05 01:15 @094

Bueno, al fin pude, aquí está como quedó:

Imagen

Ya casi está lista, el problema que estoy teniendo ahora es solo que las búsquedas anteriores se quedan en el TextView.

Ah, y le he agregado un camello de icono a la aplicación.

Mañana veo si puedo agregarle un botón para mandar al clipboard.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use LWP::Simple;
  5. use Gtk2 '-init';
  6. use constant TRUE => 1;
  7. use constant FALSE => 0;
  8.  
  9. binmode STDOUT, ":encoding(UTF-8)";
  10.  
  11. sub raeSearch()
  12. {
  13.         my $rae = get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
  14.         my $resultado;
  15.         while ($rae =~ m/name="[\d_]+"> (.*?) <\/p/smgix)
  16.         {
  17.                 my $desc = $1;
  18.                 # Quitar las marcas HTML
  19.                 $desc =~ s/<.*?>//gsm;
  20.                 # Quitar los espacios a los lados
  21.                 $desc =~ s/^\s+//sm;
  22.                 $desc =~ s/\s+$//sm;
  23.                 # Quitar espacios excesivos
  24.                 $desc =~ s/\s+/ /gsm;
  25.                 $resultado .= "$desc\n";
  26.         }
  27.                 return $resultado;
  28. }
  29.  
  30. # Propiedades de ventana:
  31. my $window = Gtk2::Window->new();
  32. $window->set_title("Rae Search");
  33. $window->set_border_width(3);
  34. $window->signal_connect(destroy => sub{Gtk2->main_quit});
  35. $window->set_auto_startup_notification(TRUE);
  36. $window->set_decorated(TRUE);
  37. $window->set_default_icon_from_file("camel.ico");
  38. $window->move(0, 0);
  39. $window->resize(700, 100);
  40. $window->set_resizable(TRUE);
  41.  
  42. # Frame:
  43. my $frame = Gtk2::Frame->new("Entrada");
  44.  
  45. # VBox:
  46. my $vbox = Gtk2::VBox->new(FALSE, 10);
  47. $vbox->pack_start($frame, TRUE, TRUE, 0);
  48.  
  49. # HBox:
  50. my $hbox = Gtk2::HBox->new(FALSE, 6);
  51.  
  52. # Entry:
  53. my $dir_entry = Gtk2::Entry->new_with_max_length(30);
  54. $dir_entry->set_text("encono");
  55. $dir_entry->set_activates_default(FALSE);
  56. $dir_entry->set_position(100);
  57.  
  58. # Button:
  59. my $button = Gtk2::Button->new("_Buscar");
  60. $button->set_focus_on_click(TRUE);
  61. my $rae;
  62.  
  63. # TextView  :
  64. my $textview = Gtk2::TextView->new();
  65. $textview->set_cursor_visible(TRUE);
  66. $textview->set_border_window_size('top', 1);
  67. $textview->set_justification('fill');
  68. my $textbuffer = $textview->get_buffer;
  69. my $textiter = $textbuffer->get_end_iter;
  70. $button->signal_connect(clicked => sub
  71.         {
  72.                 $textbuffer->insert($textiter, &raeSearch($dir_entry->get_text));
  73.                 $textview->set_buffer($textbuffer);
  74.         }
  75. );
  76.  
  77. # Scroll Window :
  78.  
  79. my $scroll = Gtk2::ScrolledWindow->new();
  80. $scroll->set_policy('automatic', 'automatic');
  81.  
  82. $scroll->add($textview);
  83.  
  84. $vbox->pack_end($scroll, TRUE, TRUE, 0);
  85.  
  86. $frame->add($hbox);
  87.  
  88. $hbox->pack_start($dir_entry, FALSE, FALSE, 0);
  89. $hbox->pack_start($button, FALSE, FALSE, 0);
  90.  
  91. $window->add($vbox);
  92. $window->show_all;
  93. Gtk2->main;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Cualquier sugerencia es bien recibida.
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Dudas con HTML::Parser

Notapor panterozo » 2010-04-05 10:16 @469

Esta muy bueno tu programa Leo_Gutierrez ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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