Ordenar array perl y regex

Iniciado por ¨°o.O (ßa¢Kg|姧) O.o°, 8 Julio 2010, 14:59 PM

0 Miembros y 1 Visitante están viendo este tema.

¨°o.O (ßa¢Kg|姧) O.o°

Hola :)

Estoy intentando cojer unos links y unas imagenes tal que queden así ordenado el array:

Dirección URL
Enlace de imagen
Dirección URL
Enlace de imagen


Así hasta que recorra el bucle y los encuentre todos.

Problemas:

No consigo que al recorrer el bucle los ponga ordenados y tampoco consigo que la expresión regular recoja el enlace de la imagen acuerdo a regex, los consigo todos pero todos los de la página.

Recojo los enlaces de las imagenes con $Explorador->find_all_images() del módulo WWW:Mechanize.

El tipo de html que esta especificado en el DOM de la página es este:

Código (html4strict) [Seleccionar]
  <table border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
           <tr>

           <td>
               <a href="http://valeptr.com/scripts/runner.php?PA=4749" target="_ptc" onclick="javascript:reloadpage(11)">
                   <img src="http://valeptr.com/scripts/runner.php?REDIRECT=http%3A%2F%2Fwww.e-qoo2.net%2Fimages%2Fbanner2.gif&amp;hash=fc93bac327d1672abbe159e0a1fc17cd" alt="e-qoo2"   border="0">
               </a>
           </td>
           </tr>
           </table>


Y  no consigo poner el link y la imagen que tiene debajo como he puesto arriba marcado en negrita.

Pongo todo el script en perl.

Código (php-brief) [Seleccionar]
#!/usr/bin/perl    
#<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
#            <tr>
#
#            <td>
#               <a href="http://valeptr.com/scripts/runner.php?PA=4749" target="_ptc" onclick="javascript:reloadpage(11)">
#                    <img src="http://valeptr.com/scripts/runner.php?REDIRECT=http%3A%2F%2Fwww.e-qoo2.net%2Fimages%2Fbanner2.gif&amp;hash=fc93bac327d1672abbe159e0a1fc17cd" alt="e-qoo2"   border="0">
#                </a>
#            </td>
#           </tr>
#            </table>

use WWW::Mechanize;
use WWW::Mechanize::Sleepy;
my $Explorador = WWW::Mechanize::Sleepy->new( agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624', sleep => '1' );
my @Array_PTC;
$Explorador->get("file:/home/alejandro/Escritorio/1appsearch.php.html") #Proceed to access the URL to find all the links in emails
    or die q{Ha ocurrido un error obteniendo la página http://valeptr.com/pages/1appsearch.php.html};

#print $Explorador->content();
foreach my $link ( $Explorador->links, $Explorador->find_all_images()  )
{
   if ( my ($interesting) = $link->url =~ qr{scripts/runner\.php\?PA=})
{
push @Array_PTC, $link->url;
    }
   if ( my ($interesting) = $Explorador->find_all_images()=~ #Aqui expresión regular)
{
push @Array_PTC, $link->url;
    }
}

print "$_\n" for @Array_PTC;


Resumiendo:
Consigo todos los enlaces que cumplen con el pattern scripts/runner\.php\?PA=
pero lo que consigo es:
   1.- Conseguir todos los enlaces de debajo de el enlace <img src=" ... "
   2.- Ordenar los enlaces para que queden link y debajo el enlace


Saludos,

~ Yoya ~

No entiendo nada, explícate mejor, que es lo que quieres hacer y como estas tratando de hacerlo y si te ayudan por lo menos escribir que lo haz resuelto, porque si no dices nada es porque no haz resolvido nada...
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Shell Root

#2
Ok, entonces el resultado sería algo como estó:

Dirección URL: :http://valeptr.com/scripts/runner.php?REDIRECT=http%3A%2F%2Fwww.e-qoo2.net%2Fimages%2Fbanner2.gif&amp;hash=fc93bac327d1672abbe159e0a1fc17cd
Enlace de imagen: :http://valeptr.com/scripts/runner.php?PA=4749

Veré que puedo hacer, aunque tal vez lo haga en PHP... :P  :silbar:
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

¨°o.O (ßa¢Kg|姧) O.o°

Cita de: ~ Yoya ~ en  8 Julio 2010, 19:11 PM
No entiendo nada, explícate mejor, que es lo que quieres hacer y como estas tratando de hacerlo y si te ayudan por lo menos escribir que lo haz resuelto, porque si no dices nada es porque no haz resolvido nada...

Haber mi idea es hacer un bucle en el cual aplicando expresiones regulares coja el enlace y la imagen que esta abajo , es decir, el enlace esta al principio y después ponga la imagen tal cual lo he puesto al principio del hilo y después  y las ponga en un array así:

   Enlace
   Imagen

Un ejemplo de como quiero hacerlo esta al principio del hilo, lo que tengo hecho es cojer el enlace aplicando expresiones regulares pero la imagen no lo se hacer para que se quede como he puesto arriba el array.

Espero haberme explicado,

Gracias por las molestias,

Saludos :)

~ Yoya ~

Vaya vaya, lo eh logrado... Como me a costado pero lo he hecho!!!. Me a causado un dolor de cabesa pensando como lo podría organizar pero aquí lo tienes y algunos conejitos...

Vasta con declarar un modulo porque uno llama otro sin necesidad de declararlo...
Citaryoya@yoya-desktop:~/Escritorio$ time perl a.pl

real   0m1.046s
user   0m0.292s
sys   0m0.016s
yoya@yoya-desktop:~/Escritorio$ time perl a.pl

real   0m0.994s
user   0m0.264s
sys   0m0.040s

El primero es con lo dos modulo y el segundo un solo...


Aqui el code:
Código (perl) [Seleccionar]
#!/usr/bin/perl   
#<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
#            <tr>
#
#            <td>
#               <a href="http://valeptr.com/scripts/runner.php?PA=4749" target="_ptc" onclick="javascript:reloadpage(11)">
#                    <img src="http://valeptr.com/scripts/runner.php?REDIRECT=http%3A%2F%2Fwww.e-qoo2.net%2Fimages%2Fbanner2.gif&amp;hash=fc93bac327d1672abbe159e0a1fc17cd" alt="e-qoo2"   border="0">
#                </a>
#            </td>
#           </tr>
#            </table>

#use WWW::Mechanize;
use WWW::Mechanize::Sleepy;
my $Explorador = WWW::Mechanize::Sleepy->new( agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624', sleep => '0' );


$Explorador->get("http://foro.elhacker.net/") #Proceed to access the URL to find all the links in emails
     or die q{Ha ocurrido un error obteniendo la página http://valeptr.com/pages/1appsearch.php.html};

my @links = $Explorador->links();
my @img = $Explorador->find_all_images(tag_regex => qr/^(img)$/i );
foreach (@links){
$links .= $_->url();
$links .= " ";
}
foreach (@img){
$img .= $_->url();
$img .= " ";
}

@url = split(/\s+/,$links);
@images = split(/\s+/,$img);
for($i = 0;$i <= 5;$i++){
print "Url-> ".@url[$i], "\n";
print "Img-> ".@images[$i], "\n";
}


Salida:
yoya@yoya-desktop:~/Escritorio$ perl a.pl
Url-> http://foro.elhacker.net/.xml.html;sa=news;board=34;limit=10;type=rss
Img-> http://foro.elhacker.net/Themes/converted/selogo.jpg
Url-> http://foro.elhacker.net/Themes/converted/css/style.css
Img-> http://foro.elhacker.net/Themes/converted/der_logo.jpg
Url-> http://www.elhacker.net
Img-> http://foro.elhacker.net/Themes/converted/images/spanish/home.gif
Url-> http://foro.elhacker.net/login.html
Img-> http://foro.elhacker.net/Themes/converted/images/spanish/help.gif
Url-> http://foro.elhacker.net/register.html
Img-> http://foro.elhacker.net/Themes/converted/images/spanish/login.gif
Url-> http://foro.elhacker.net/activate.html
Img-> http://foro.elhacker.net/Themes/converted/images/spanish/register.gif


Pd: Si no entiendes algo me avisas por este mismo Post y responder el post si te a funcionado...

Saludos!
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

¨°o.O (ßa¢Kg|姧) O.o°

#5
Buenas he estado probando el código y con esta página funciona pero con la página web que quiero hacerlo funcionar no funciona:
  Le he añadido  url_abs_regex => pero no lo consigo.

El problema esta en que se muestran todos los enlaces y entonces al haber tantos enlaces por logica se acaban las imagenes y salen en blanco como en esta imagen.

Aqui coje todos los enlaces sin mirar la expresión regular





El problema está en que no coje bien la expresión regular.
PD: Gracias por el tips, esos tiempos de cpu hay que reducirlos al máximo
Gracias,
Saludos,


~ Yoya ~

Tienes que leer un poco la documentación del modulo mechanize...

Tienes dos opción para aplicarle expresiones regulares al array que contiene los links y también el que contiene las imágenes.

Puedes usar url_regex => qr/regex/ tanto para links y imagenes...

O simplemente le aplicas expresiones regulares al array que contiene los links y imagenes...
Aplicando expresiones regulares a arrays


Para el otro problema, si existe mas links que imágenes o viceversa, puedes usar un if() o puedes crear una función y usar un poco de lógica xD.

Ej:
Código (perl) [Seleccionar]

#!/usr/bin/perl

@numeros = qw(12 12 45 87 91 1);
@letras = qw(sd sf ss aaaas);

if(scalar(@numeros) <= scalar(@letras)){
for($i = 0;$i <= scalar(@numeros);$i++){
print $i, "\n";
}
}else{
for($i = 0;$i <= scalar(@letras);$i++){
print $i, "\n";
}
}


Salida:
yoya@yoya-desktop:~/Escritorio$ perl s.pl
0
1
2
3
4
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.