• Publicidad

Extraer definiciones desde thefreedictionary.com

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

Extraer definiciones desde thefreedictionary.com

Notapor BigBear » 2012-03-17 16:37 @734

Hola. Tengo un problema con una expresión regular en la página http://es.thefreedictionary.com/.

Estoy tratando de sacar solo el primer significado pero el código no me devuelve nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2.  
  3. use LWP::UserAgent;
  4.  
  5. my $nave = LWP::UserAgent->new;
  6. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  7. $nave->timeout(5);
  8.  
  9. my $page = "http://es.thefreedictionary.com/casa";
  10.  
  11. my $code = toma($page);
  12.  
  13. chomp $code;
  14.  
  15. #<div class="runseg"><b>1 </b>&nbsp; Edificio o parte de él donde viven una o más personas: <span class="illustration">
  16.  
  17. if ($code=~/<div class="runseg"><b>1 <\/b>&nbsp; (.*): <span class="illustration">/) {
  18.     print $1;
  19. }
  20.  
  21. sub toma {
  22.     return $nave->get($_[0])->content;
  23. }
  24.  
  25.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿ Alguien me ayuda ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Extraer definiciones desde thefreedictionary.com

Notapor explorer » 2012-03-17 17:39 @777

Sobran las comillas alrededor de runseg. Y pondría un '?' detrás de .*

Con Mojolicious es incluso más fácil...

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -Mojo -CS  -E '$_ = g("http://es.thefreedictionary.com/casa")->dom->at("div[class=runseg]")->text; s/^\s+|[: ]+$//g; say'
  2. Edificio o parte de él donde viven una o más personas
Coloreado en 0.003 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: Extraer definiciones desde thefreedictionary.com

Notapor BigBear » 2012-03-17 18:30 @812

Gracias, explorer.

El código quedó de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. use LWP::UserAgent;
  3.  
  4. my $nave = LWP::UserAgent->new;
  5. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  6. $nave->timeout(5);
  7.  
  8.  
  9. my $page= "http://es.thefreedictionary.com/auto"; #ok
  10. #my $page = "http://es.thefreedictionary.com/persona";
  11.  
  12. my $code = toma($page);
  13.  
  14. chomp $code;
  15.  
  16. if ($code=~/<div class=runseg><b>1 <\/b>&nbsp; (.*?): <span class=illustration/) {
  17.     print $1;
  18. }
  19.  
  20. sub toma {
  21.     return $nave->get($_[0])->content;
  22. }
  23.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aún hay más. Tengo dos problemas: cuando busco 'auto' me devuelve esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Breve composici&#xf3;n dram&#xe1;tica en la que aparecen personajes b&#xed;blico
s y aleg&#xf3;ricos
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me gustaría saber cómo puedo evitar esos caracteres raros que salen.

Y tengo otra duda, porque cuando busco 'persona' me devuelve esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Individuo de la especie humana.  <span class=Syn>hombre, ser humano. </span></di
v><div class=runseg><b>2 </b>&nbsp; Hombre o mujer cuyo nombre se ignora o se om
ite
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me gustaría saber cómo puedo perfeccionar la expresión regular anterior para evitar todo lo que le sigue a <span class=Syn>.

¿ Podrás ayudarme ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Extraer definiciones desde thefreedictionary.com

Notapor explorer » 2012-03-17 18:56 @830

No son caracteres raros. Son caracteres tildados codificados en iso-8859-1 pero escritos como entidades HTML.

Necesitarás pasar todo el texto por algún módulo que convierta esas entidades a caracteres "normales". Así, & #xe1; será una 'á'.

Eso lo puedes hacer con varios módulos. Por ejemplo, HTML::Entities.

Para evitar lo del <span>, podríamos aceptar la idea de que lo que nos interesa es el texto que hay antes del primer '<'. Así, la expresión queda:

$code =~ /<div class=runseg><b>1 <\/b>&nbsp; (.*?): </

Je, je... con Mojolicious sigue quedando genial :)
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -Mojo -CS -E '$_ = g("http://es.thefreedictionary.com/persona")->dom->at("div[class=runseg]")->text; s/^\s+|\W+$//g; say'
  2. Individuo de la especie humana
  3. $ perl -Mojo -CS -E '$_ = g("http://es.thefreedictionary.com/auto")->dom->at("div[class=runseg]")->text; s/^\s+|\W+$//g; say'
  4. Breve composición dramática en la que aparecen personajes bíblicos y alegóricos
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: Extraer definiciones desde thefreedictionary.com

Notapor BigBear » 2012-03-17 19:11 @841

explorer, me sigue dando el error cuando busco 'persona'.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Individuo de la especie humana.  <span class=Syn>hombre, ser humano. </span></di
v><div class=runseg><b>2 </b>á Hombre o mujer cuyo nombre se ignora o se omite
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El código ha quedado así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2.  
  3. use LWP::UserAgent;
  4. use HTML::Entities;
  5.  
  6. my $nave = LWP::UserAgent->new;
  7. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12)
  8.  
  9. Gecko/20080201Firefox/2.0.0.12");
  10. $nave->timeout(5);
  11.  
  12.  
  13. #my $page= "http://es.thefreedictionary.com/auto"; #ok
  14. my $page = "http://es.thefreedictionary.com/persona";
  15.  
  16. my $code = toma($page);
  17.  
  18. chomp $code;
  19.  
  20. if ($code=~/<div class=runseg><b>1 <\/b>&nbsp; (.*?): </) {
  21. my $text = decode_entities($1);
  22. print $text;
  23. }
  24.  
  25. sub toma {
  26. return $nave->get($_[0])->content;
  27. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Extraer definiciones desde thefreedictionary.com

Notapor explorer » 2012-03-17 20:02 @877

Entonces hay que cambiar la expresión regular: hay que parar la captura cuando encontremos un punto o un dos puntos:

$code=~/<div class=runseg><b>1 <\/b>&nbsp; (.*?)[.:]/

aunque... también podría ocurrir que no hubiera ninguno de esos caracteres antes de un '<'. Así que mejor lo agregamos:

$code=~/<div class=runseg><b>1 <\/b>&nbsp; (.*?)[.:<]/
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: Extraer definiciones desde thefreedictionary.com

Notapor BigBear » 2012-03-17 20:27 @894

Vamos mejorando, todo está perfecto, pero hay otro problema: cuando busco la palabra 'terrateniente' no me aparece nada. Lo probé con el navegador y aparece información. Entonces, ¿cómo puedo hacer para que la expresión regular también funcione con esa palabra?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Extraer definiciones desde thefreedictionary.com

Notapor explorer » 2012-03-18 00:33 @064

Pues porque en lugar de marcas <b> hay marcas <i>.

Prueba a cambiar las 'b' por '(?:b|i)', pero... también es variable el texto que aparece dentro de esas marcas.
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


Volver a Básico

¿Quién está conectado?

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