• Publicidad

Extraer los directorios de código fuente HTML con expresión

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Extraer los directorios de código fuente HTML con expresión

Notapor Dshellnoi_Unix » 2013-04-06 21:49 @951

Recién comienzo con las expresiones regulares y me parece todo un arte al igual que complejo.

Estoy intentando extraer los directorios del código fuente de una página web pero no consigo coger la lógica para que tenga más profundidad. :(

En mis intentos he intentado lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($p =~ m/(\/[^\/tag | TR | tr | www | xhtml1 ]+[a-zA-Z0-9_-]{1,}\/+[a-zA-Z0-9_-]{1,}\/)/) {
  2.         if (!grep $_ eq $1, @dirs) {
  3.             push(@dirs, $1);
  4.             }
  5.     }
  6.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La var $p es la línea que va interpretando el código fuente.

O sea: creo que le he indicado que busque cualquier directorio que no empiece por '/tag', '/TR', '/tr', '/www' y '/xhtml1', seguido de cualquier palabra más '/' seguido de cualquier palabra más '/' y que si no es repetida la concordancia que lo meta dentro de un array... pero solo consigo una profundidad de dos directorios.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. /js/jquery/
  2. /blogified/scripts/
  3. /blogi_fied/scripts/
  4. /b_log-ified/scripts/
  5. /blogi66fied-okok/scripts/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me preguntaba si hay alguna manera en que no importe la profundidad de la ruta, sin tener que repetir esta parte
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. [a-zA-Z0-9_-]{1,}\/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
como hice en el código expuesto.

Gracias de antemano... Agradezco también toda la ayuda brindada en el foro ya que gracias a esa ayuda voy progresando :) Viva Perl y a los perleros.
Avatar de Usuario
Dshellnoi_Unix
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2013-02-24 15:43 @696
Ubicación: Las Palmas de Gran Canaria

Publicidad

Re: Extraer los directorios de código fuente HTML con expres

Notapor explorer » 2013-04-07 08:57 @415

Veo que le has añadido espacios en blanco alrededor de los nombres de los directorios que no quieres capturar. Creo que sobran...

A ver... podemos deducir la expresión regular si transcribimos lo que queremos capturar. ¿Y qué queremos capturar? Podemos decirlo así:

«Por cada línea leída del archivo HTML, queremos extraer todos los directorios indicados».

¿Qué es un directorio? Dentro de la definición de un URI, la parte de localización de un recurso consiste en una serie de nombres que indican el directorio y subdirectorios en donde se encuentra el recurso, intercalados por '/'. O sea, lo que es una ruta.
  • '/' inicial, opcional (si está presente, indica una ruta absoluta, Si no, es relativa)
  • uno o más nombres de directorio, que consisten en letras y números, terminados por '/'
Entonces, podemos expresarlo así: /?(directorio/)+

Ahora ya podemos construir la parte del programa para extraer los directorios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($p =~ m{(/?([\w_-]+/)+)}g) {
    my $dir = $1;
    next if $dir =~ m{^(/tag|/TR|/tr|/www|/xhtml1)};

    $directorios{ $dir } = 1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

  • Usamos un bucle while(), junto con una expresión regular con la opción '/g', para que busque por todos los directorios de la línea (puede haber más de uno)
  • El patrón del directorio es '[\w_-]', en la que '\w' representa los caracteres alfanuméricos. Más luego los dos caracteres '_' y '-'
  • El patrón está rodeado por llaves, en lugar de '/'. Eso nos permite usar las '/' de forma directa, sin tener que escaparlas con una '\'
  • Si coincide el patrón, es capturado en $1, y lo guardamos como clave en el hash %directorios. Como las claves de un hash son únicas, nos ahorra tener que filtrar los duplicados
  • Pero antes, si el directorio coincide con alguno de los que no queremos, saltamos al siguiente
La salida ser puede hacer así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for  my $dir (sort keys %directorios) {
    say $dir;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(suponiendo que hemos activado el soporte para say())

Si queremos guardarlo en un array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @directorios = keys %directorios;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras, la solución no es perfecta. Un URI o URL es más complicado que todo esto. (Ver expresión regular de la función uri_split() del módulo URI::Split).
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 los directorios de código fuente HTML con expres

Notapor Dshellnoi_Unix » 2013-04-07 18:44 @822

Una explicación magistral, aún ando medio perdido con la expresiones regulares. Supongo que será cuestión de práctica y tiempo... Lo he implementado y funciona divinamente. Muchas gracias :)
Avatar de Usuario
Dshellnoi_Unix
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2013-02-24 15:43 @696
Ubicación: Las Palmas de Gran Canaria


Volver a Intermedio

¿Quién está conectado?

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