• Publicidad

Sacar todos los enlaces de 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.

Sacar todos los enlaces de una página

Notapor BigBear » 2013-08-20 19:44 @863

Hola, estoy queriendo hacer una expresión regular en Perl para extraer todos los enlaces porque la voy a usar en Delphi y no puedo usar HTML::LinkExtor que tiene Perl al regalarme todos los enlaces.

Había hecho algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($code=~/http\:\/\/(.*?)\//) {
  2.     print "http://".$1;
  3. }
  4.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero mi exp. reg. no ayudó en mucho con el tema de los espacios. ¿ Alguien me podría ayudar ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Sacar todos los enlaces de una página

Notapor explorer » 2013-08-20 20:04 @878

¿Espacios en una URL? Qué raro... No debería haber ninguno.

¿Algún ejemplo?
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: Sacar todos los enlaces de una página

Notapor danimera » 2013-08-20 20:12 @883

mmm, que raro yo veo la expresion bien, y eso de los espacio, que sera ? para decirle que si tiene un espacio una url esta mala o que ?
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: Sacar todos los enlaces de una página

Notapor BigBear » 2013-08-20 20:16 @886

Así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $code = '
  2.  
  3. <a href="http://www.google.com">test</a><br>
  4. <a href="http://pastebin.com/ysNhSnMp">test1</a><br>
  5. <a href="http://pastebin.com/x11fMS0S">test2</a><br>
  6. <a href="http://pastebin.com/RkRX4T6R">test3</a><br>
  7. <a href="http://pastebin.com/4ETmL9ru">test4</a><br>
  8. <a href="http://pastebin.com/1xaVaEEk">test5</a><br>
  9.  
  10. dsad http://pastebin.com/1xaVaEEk dsadas
  11. hsdasd http://pastebin.com/1xaVaEEk d sadsa
  12. sadsad http://pastebin.com/1xaVaEEk dsadsd';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y me exp. reg. solo devuelve esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://www.google.com">test<
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Sacar todos los enlaces de una página

Notapor explorer » 2013-08-20 21:02 @918

No es un problema de espacios, sino de saber dónde empieza y termina una URL.

Se puede usar un truco: capturamos el carácter que está justo antes de la URL, y esperamos ese mismo carácter a continuación de la URL. No funcionará en todos los casos, pero según el ejemplo puesto, sí en esos casos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. !/usr/bin/perl
  2. use v5.14;
  3.  
  4. my $code = '
  5.  
  6. <a href="http://www.google.com">test</a><br>
  7. <a href="http://pastebin.com/ysNhSnMp">test1</a><br>
  8. <a href="http://pastebin.com/x11fMS0S">test2</a><br>
  9. <a href="http://pastebin.com/RkRX4T6R">test3</a><br>
  10. <a href="http://pastebin.com/4ETmL9ru">test4</a><br>
  11. <a href="http://pastebin.com/1xaVaEEk">test5</a><br>
  12.  
  13. dsad http://pastebin.com/1xaVaEEk dsadas
  14. hsdasd http://pastebin.com/1xaVaEEk d sadsa
  15. sadsad http://pastebin.com/1xaVaEEk dsadsd';
  16.  
  17. while ($code =~ m{(.)(http://.+?)\1}g) {
  18.     say "$2";
  19. }
  20. __END__
  21. http://www.google.com
  22. http://pastebin.com/ysNhSnMp
  23. http://pastebin.com/x11fMS0S
  24. http://pastebin.com/RkRX4T6R
  25. http://pastebin.com/4ETmL9ru
  26. http://pastebin.com/1xaVaEEk
  27. http://pastebin.com/1xaVaEEk
  28. http://pastebin.com/1xaVaEEk
  29. http://pastebin.com/1xaVaEEk
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: Sacar todos los enlaces de una página

Notapor BigBear » 2013-08-23 18:52 @828

Gracias por la ayuda, explorer. Mira cómo quedó el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using delphi Syntax Highlighting
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var code:string;
  3.     i:integer;
  4. begin
  5. code:=idHTTP1.Get('http://localhost/test.php');
  6.  
  7. PerlRegEx1.Regex := '(.)(http://.+?)\1';
  8. PerlRegEx1.Subject := code;
  9.  
  10. while PerlRegEx1.MatchAgain do
  11. begin
  12. for i := 1 to PerlRegEx1.SubExpressionCount do
  13. begin
  14. Memo1.Lines.Add(PerlRegEx1.SubExpressions[i]);
  15. end;
  16. end;
  17.  
  18. end;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Y me devuelve esto :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"
http://www.google.com
"
http://pastebin.com/ysNhSnMp
"
http://pastebin.com/x11fMS0S
"
http://pastebin.com/RkRX4T6R
"
http://pastebin.com/4ETmL9ru
"
http://pastebin.com/1xaVaEEk
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Puede bastarme con este resultado pero te quería preguntar por qué están esos '"' en medio.

¿ Me podrías explicar ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Sacar todos los enlaces de una página

Notapor explorer » 2013-08-23 21:05 @920

Pues porque tú se lo estás pidiendo, en la línea 12... estás recorriendo todas las cadenas capturadas, y la $1 es la del primer par de paréntesis, que en este caso está capturando comillas dobles. Solo te interesa el valor de $2.

Cambia las líneas 12 a 16 por solo esta.
Sintáxis: [ Descargar ] [ Ocultar ]
Using delphi Syntax Highlighting
  1. Memo1.Lines.Add(PerlRegEx1.SubExpressions[2]);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


P.D.: hace 17 años que no me ponía con Delphi :) Un bonito lenguaje, pero lo malo es que solo sirve para Windows. Lástima.
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: Sacar todos los enlaces de una página

Notapor BigBear » 2013-08-24 12:47 @574

Gracias por la ayuda, explorer, no sabía que programabas en Delphi también, pero en Linux podes usar Lazarus.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818


Volver a Básico

¿Quién está conectado?

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