• Publicidad

Expresión regular en una página

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

Expresión regular en una página

Notapor BigBear » 2012-05-05 17:04 @753

Bueno, tengo el siguiente código.

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->timeout(5);
  7. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  8.  
  9. getproxy();
  10.  
  11. sub getproxy {
  12.  
  13. my $code = toma("http://www.proxys.com.ar/index.php?act=list&port=&type=&country=&page=1");
  14.  
  15. if($code=~/<tr class="cells" onmouseover="this.className='cells2'" onmouseout="this.className='cells'">(.*?)<\/tr>/sig) {
  16. my $porcion = $1;
  17. chomp $porcion;
  18. print $porcion;
  19. if($porcion=~/<td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td>/sig) {
  20. my($id,$ip,$port,$type,$pais,$fecha) = ($1,$2,$3,$4,$5,$6);
  21. print "$ip:$port:$pais\n";
  22. }}
  23.  
  24. }
  25.  
  26. sub toma {
  27. return $nave->get( $_[0] )->content;
  28. }
  29.  
  30. #The End ?
  31.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El problema está en la segunda expresión regular de la cual quiero sacar cada dato que está entre los <td>.

El texto del que quiero extraer es este

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
    <td >1</td>
    <td>203.117.130.15</td>
    <td>80</td>
    <td>Elite</td>
    <td> Vietnam</td>
    <td>Hoy</td>
    <td><a href="index.php?act=whois&ip=203.117.130.15" target="_blank"><span cl
ass="sp_link">WHOIS</span></a></td>
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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

Publicidad

Re: Expresión regular en una página

Notapor explorer » 2012-05-05 17:24 @766

Una manera, de las posibles.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @td = $porcion =~ m{<\s*td\s*>\s*(.*?)\s*</\s*td}g;
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: Expresión regular en una página

Notapor BigBear » 2012-05-05 17:41 @778

Me quedó re-bien. ¿Me podes indicar cómo puedo hacerlo de la forma sencilla como lo tenía pensando en vez de tener los resultados en un array?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Expresión regular en una página

Notapor explorer » 2012-05-05 18:13 @801

Si te puse el array es porque es más cómodo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @td = $porcion =~ m{<\s*td\s*>\s*(.*?)\s*</\s*td}g;
  2. say join ':', @td[1,2,4];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si lo quieres de forma separada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my(undef,$ip,$port,undef,$pais,undef) = $porcion =~ m{<\s*td\s*>\s*(.*?)\s*</\s*td}g;
  2. say join ':', $ip, $port, $pais;
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: Expresión regular en una página

Notapor BigBear » 2012-05-05 18:27 @810

Ok, el código me ha quedado de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl         
  2.  
  3. #1-5
  4.  
  5. use LWP::UserAgent;
  6.  
  7. my $nave = LWP::UserAgent->new();
  8. $nave->timeout(5);
  9. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  10.  
  11. getproxy();
  12.  
  13. sub getproxy {
  14.  
  15.     my $code = toma("http://www.proxys.com.ar/index.php?act=list&port=&type=&country=&page=1");
  16.  
  17.     if ( $code
  18.         =~ /<tr class="cells" onmouseover="this.className='cells2'" onmouseout="this.className='cells'">(.*?)<\/tr>/sig
  19.         ) {
  20.         my $porcion = $1;
  21.         chomp $porcion;
  22.  
  23.         while ( my @total = $porcion =~ m{<\s*td\s*>\s*(.*?)\s*</\s*td}mig ) {
  24.             push( @founds, $total[1] . ":" . $total[2] . ":" . $total[4] );
  25.         }
  26.     }
  27.  
  28.     for (@founds) {
  29.         print $_. "\n";
  30.     }
  31.  
  32. }
  33.  
  34. sub toma {
  35.     return $nave->get( $_[0] )->content;
  36. }
  37.  
  38. #The End ?
  39.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que solo recoge el primer valor de la tabla y mi idea es que capture todos.

¿ Cómo podría mejorar el código para que haga lo que quiero ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Expresión regular en una página

Notapor explorer » 2012-05-05 18:41 @820

Supongo que lo que habrá que hacer es leer cada línea <tr>, así que tendrás que cambiar el if() de la línea 17 por un while().
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: Expresión regular en una página

Notapor BigBear » 2012-05-06 08:46 @407

Estoy intentando el mismo proceso en otra página.

http://proxies.my-proxy.com/proxy-list-4.html

Me gustaría intentar sacar los datos pero no están en una tabla y no sé cómo sacar los datos de la IP y el puerto que están entre ':'.

¿ Cómo puedo hacerlo ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Expresión regular en una página

Notapor explorer » 2012-05-06 13:11 @591

Sencillísimo...

my @IP_PORT = $html =~ m/(\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+)/g;

Salen 300.

Queda como ejercicio para el lector deducir cómo es posible esto, sin indicar ningún tipo de 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


Volver a Básico

¿Quién está conectado?

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

cron