2011-06-06 11:10 @507 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Consulta por expresión regular
|
|
Hola, que tal, soy nuevo en el foro, estaba necesitando encontrar un grupo que trabaje con Perl, ya que hace tiempo estuve en el tema y ahora me estoy volviendo a integrar.
Mi consulta, estimo que debe ser muy simple. Espero me puedan ayudar.
Tengo un html, donde dentro de las etiquetas <ul><il></il></ul> está la información que necesito; esto se repite dentro del código varias veces y necesito extraerlo por cada vez que encuentre la etiqueta <ul>.
Yo, en el primer momento, descargo el contenido HTML a una variable $contenido:
my $req = HTTP::Request->new(GET => $publi); my $response = $browser->request($req); my $contenido = $response->content(); $contenido =~ s/[\t\n]//g;
Lo limpio de tabuladores y saltos de línea. Encuentro la región que contiene la etiqueta <ul> y la capturo a $1.
$contenido = $1;
Luego intento hacer un proceso para sustraer los datos.
while ( $contenido =~ /<ul class="gridRow.*">(.*)<div/g ) {
encuentra lo que busco, pero no lo hace por cada vez que inicia con la etiqueta <ul>. No sé si me explico bien.
Espero que alguien entienda, de lo contrario, respondo preguntas o reformulo la cuestión... Gracias.
|
2011-06-06 19:06 @837 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
Using html4strict Syntax Highlighting <div class="divAdsenseGridTop afsGrid ">
<ul class="gridRow cat344 ">
<li class="date"> fecha</li>
<li class="photo"><a class='nophoto' href='#' title='#'><img/></a></li>
<li class="title"><a href="#"> Dato </a><span class="location">#</span></li>
<li class="category">#</li>
<li class="price">u$s </li>
</ul>
<ul class="gridRow cat344 ">
<li class="date"> fecha</li>
<li class="photo"><a class='nophoto' href='#' title='#'><img/></a></li>
<li class="title"><a href="#"> Dato </a><span class="location">#</span></li>
<li class="category">#</li>
<li class="price">u$s </li>
</ul>
</div>
Esta es una porción del código; logro captar el contenido dentro de las <div>, y lo almaceno en $1 $contenido = $1; $contenido =~ s/[\t\r]/ /g; # Elimino espacios y demás, para detectar mas fácilmente el contenido Mi problema es al querer hacer un proceso repetitivo (while) de reconocimiento para cada <ul>, para procesar cada class (que ya lo tengo resuelto). Disculpen, soy medio bruto explicándome. Voy a intentar de la manera que me proponen.
| Última edición por explorer el 2011-06-06 19:12 @841, editado 2 veces en total |
| Marcado HTML |
|
2011-06-06 20:08 @881 |
|
|
 |
ileiva
Perlero Nuevo
|
Registrado: 2011-04-23 03:25 @184 Ubicación: Santiago, Chile Mensajes: 30
|
|
|
Re: Consulta por expresión regular
|
Bueno, asumiendo que tienes listo lo de procesar cada class, entonces algo así debería funcionar: Using perl Syntax Highlighting #!/usr/bin/perl
use File::Slurp;
use strict;
my $f = read_file('file.html');
while ($f =~ /<div .*?>(.*?)<\/div>/gs ) {
my $div_content = $1;
while ($div_content =~ /<ul .*?>(.*?)<\/ul>/gs ) {
print $1; # Procesar aquí cada class
}
}
Los modificadores g y s indican que se debe procesar todas las ocurrencias encontradas y tratar la cadena como una sola línea respectivamente. Saludos.
_________________ This is your life, and it's ending one minute at a time.
|
2011-06-06 20:17 @887 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
explorer escribió: Bienvenido a los foros de Perl en español, teofederico.
Los comodines avariciosos (.*) son peligrosos, porque capturan todo lo que puedan, a veces, demás.
Deberías usar comodines no avariciosos (.*?). Algo así:
m{<ul .*?>(.*?)</ul>}
De esta manera, la captura está garantizada desde que empieza <ul> hasta el primer </ul> que encuentre.
Como dice ileiva, estaría bien ver un poco de código original. Muchisimas gracias! funciono excelente! Si estan por Argentina, les invito o unos mates o una cerveza.
|
2011-06-06 22:55 @997 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
Efectivamente ileiva, Ya tenía gran porción del código hecho, hasta que me di cuenta, que lo estaba haciendo mal. Ya que algunos parámetros se me escapan por hacer mal el regex, solo tuve que agregar "}g" al código de nuestro colega, para así, dejarlo funcional. Te agradezco, ahora estoy viendo si puedo interactuar con un archivo ASP de un sitio, que no crea peticiones por url y es más complicado. Resumiendo, el código terminó: Using perl Syntax Highlighting if ( $contenido =~ m/(<ul class="gridRow.*">.*<\/div>)/g ) {
$contenido = $1;
while ( $contenido =~ m{<ul class="gridRow.*?">(.*?)</ul>}g ) { aqui parseo cada class y obtengo los datos }
}
¡ Gracias ! ¿ Agrego al título "Resuelto" ?
|
2011-06-07 01:29 @104 |
|
|
 |
ileiva
Perlero Nuevo
|
Registrado: 2011-04-23 03:25 @184 Ubicación: Santiago, Chile Mensajes: 30
|
|
|
Re: Consulta por expresión regular
|
Qué bueno que ya lo solucionaste, para eso está el foro  . teofederico escribió: ¿ Agrego al título "Resuelto" ? Yo creo que sí. Saludos.
_________________ This is your life, and it's ending one minute at a time.
|
2011-06-07 01:32 @105 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
|
BORRADO por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:19 @680, editado 1 vez en total
|
2011-06-07 03:49 @200 |
|
|
 |
ileiva
Perlero Nuevo
|
Registrado: 2011-04-23 03:25 @184 Ubicación: Santiago, Chile Mensajes: 30
|
|
|
Re: Consulta por expresión regular
|
Basándome en una de tus respuestas anteriores, donde pusiste esto: Using perl Syntax Highlighting if ( $contenido =~ m/(<ul class="gridRow.*">.*<\/div>)/g ) {
$contenido = $1;
while ( $contenido =~ m{<ul class="gridRow.*?">(.*?)</ul>}g ) { aqui parseo cada class y obtengo los datos }
}
Te aconsejaría que una vez que entras al if (y luego al while) vayas creando nuevas variables para almacenar el valor de las ocurrencias en vez de modificar la misma que estás procesando, que en este caso es $contenido. Si lo piensas detenidamente, estás alterando el valor de la información que procesas por tanto pierdes lo que tenías antes de encontrar alguna ocurrencia. Espero haya quedado claro. Saludos.
_________________ This is your life, and it's ending one minute at a time.
|
2011-06-07 10:09 @465 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
|
BORRADO por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:19 @680, editado 1 vez en total
|
2011-06-07 10:18 @471 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
|
BORRADO por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:19 @679, editado 1 vez en total
|
2011-06-07 11:07 @505 |
|
|
 |
ileiva
Perlero Nuevo
|
Registrado: 2011-04-23 03:25 @184 Ubicación: Santiago, Chile Mensajes: 30
|
|
|
Re: Consulta por expresión regular
|
Si siempre tendrán el mismo formato, puedes aprovechar que sabes cuál es la última <div> contenida dentro de la que quieres. Esto me funciona: Using perl Syntax Highlighting m{<div class="classified-summary">(.*?<span class="price-list">.*?<\/span>)\s+<\/div>}gs
No es muy bonito que digamos, pero funciona. Saludos.
_________________ This is your life, and it's ending one minute at a time.
|
2011-06-07 12:04 @544 |
|
|
teofederico
Perlero Nuevo
|
Registrado: 2011-06-06 10:53 @495 Mensajes: 13
|
|
|
Re: Consulta por expresión regular
|
|
Borrado por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:18 @679, editado 2 veces en total
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|