• Publicidad

Regex recursivo

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

Regex recursivo

Notapor mikel_2 » 2012-05-02 09:57 @456

Siento que el título sea tan poco explicativo, pero la verdad es que no entiendo ni yo mismo cómo hacer lo que quiero :lol:

Estoy creando un script que descargue recursivamente las imágenes de todo un blog. Tengo más o menos todo montado y "funcionando" usando unicamente LWP::Simple. El problema viene al "extraer" los enlaces a esas imágenes. Lo primero que hago es descargar la página así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $html = get($page) or die "$!\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ahora viene el problema y es que no entiendo cómo "extraer" los enlaces de todo ese código HTML que está dentro $html. Sé cómo "extraer" 1 solo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $html =~ m/(\d+.media.tumblr.com\/tumblr_[A-Za-z0-9_.-\/]+)/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Cómo he de hacer para sacar todos los enlaces? Pensé que '/g' me valdría para ello y los enlaces quedarían en $1, $2... y así, pero no :lol: xD

Un saludo y gracias por pasar ;)
mikel_2
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-08-23 15:29 @686

Publicidad

Re: ¿Regex recursivo?

Notapor danimera » 2012-05-02 10:41 @487

Usa Mechanize para eso:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use WWW::Mechanize;
  2.     my $mech = WWW::Mechanize->new();
  3.  
  4.     $mech->get( $url );
  5.  
  6. $mech->find_image( url_regex => qr/tumblr_/, );
  7.  
  8. # o encuentra todas
  9.  
  10. $mech->find_all_images( ... )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por danimera el 2012-05-02 10:43 @488, editado 1 vez en total
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Regex recursivo

Notapor explorer » 2012-05-02 10:43 @488

Sí, que obtienes todos los valores, pero no los estás guardando.

Tienes varias formas:

Recuperar todos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @enlaces = $html =~ m{(\d+[.]media[.]tumblr[.]com/tumblr_[A-Za-z0-9_.\/-]+)}g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


O con un bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($html =~ m{(\d+[.]media[.]tumblr[.]com/tumblr_[A-Za-z0-9_.\/-]+)}g) {
    my $enlace = $1;
    ...;
}
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: Regex recursivo

Notapor mikel_2 » 2012-05-02 11:01 @500

Gracias a ambos, me ha venido de perlas la primera que pusiste para recuperar todos los enlaces ;) , ya que con la segunda habría de saber cuántos enlaces tengo en la página, ¿no?

Tengo también varias preguntas, la más importante es: ¿qué diferencias hay entre mi expresión regular y la tuya? Me llama la atención sobretodo la diferencia que pueda haber entre m{...}g y m/.../g o los puntos dentro de los corchetes...

Un saludo y gracias por ser tan rápidos.
mikel_2
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-08-23 15:29 @686

Re: Regex recursivo

Notapor explorer » 2012-05-02 16:01 @709

No, no necesitas saber por antelación el número de enlaces posibles. Las dos expresiones regulares hacen lo mismo.

El usar las llaves en lugar de los delimitadores normales '/.../' es para no tener que "escapar" los caracteres '/' que hubiese en el patrón (hay un carácter así delante de tumblr_.

Y el poner los puntos entre corchetes es porque queremos decir que esos puntos son literales (puntos), no son comodines (un punto en un patrón representa un carácter cualquiera).

Y repasa la respuesta anterior de danimera: hay métodos mucho más cómodos para recuperar la información de una página web.

Lo más moderno, hoy en día, es usar Mojolicious, como por ejemplo Mojo::DOM.
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 21 invitados

cron