• Publicidad

Primera ocurrencia en una búsqueda

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Primera ocurrencia en una búsqueda

Notapor makmanco » 2012-07-22 07:02 @335

Ante todo, felicidades por esta página que me ha ahorrado un montón de horas buscando información y a los comentarios de explorer que aparecen en todos los lados :P

Tengo un problemilla con una búsqueda de un html que me llega que necesito sacar los vídeos de Youtube y los comentarios asociados.

Porción del html que quiero capturar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <div id="cuerpo_13234" class="cuerpo">
  2.         Texto pruebra bllalblalbla
  3. <iframe title="YouTube video player" src="http://www.youtube.com/embed/h60pSZyaJBo?rel=0&amp;hd=1&amp;wmode=opaque" frameborder="0" allowFullScreen></iframe>
  4.        Blablalvbla
  5. </div>
  6.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Código para encontrar coincidencias Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         #html pasado por referencia
  2.  
  3.         while (${$html} =~ m/\<div id\=\"cuerpo\_[0-9]*\" class\=\"cuerpo\"\>.*youtube.*\</div\>/sig) {
  4.                 print "Encontrado '$&'.\n\n-----------------------------------------------------------------------------\n\n";
  5.         }
  6.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Modificador /s para poner texto en una sola línea ya que el /m que se supone que es el multi-línea, no me lo coge.

La cosa es que me coge la primera condición del <div> con la última del cierre del <div>. Utilizo el Strawberry de Windows. No creo que haya ninguna gran diferencia.

Un saludo y gracias por vuestro tiempo.
makmanco
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-07-22 06:53 @328

Publicidad

Re: Primera ocurrencia en una búsqueda

Notapor explorer » 2012-07-22 09:27 @435

Bienvenido a los foros de Perl en Español, makmanco.

La opción /s hace que se trate a la cadena como una sola línea. Eso quiere decir que el comodín "." también coincidirá con cualquier carácter, incluidos los de fin de línea (que normalmente no lo haría). La opción /m trata a la cadena como compuesta por múltiples líneas, así que las anclas "^" y "$" coinciden en cualquier parte dentro de la cadena, y no en los extremos de la cadena.

El problema está en los operadores avariciosos ".*" que, por defecto, coinciden con cualquier cosa, hasta la última coincidencia posible. Por eso, cuando pones ".*</div>" coincidirá con todo el texto, hasta llegar antes del último </div>.

Hay que cambiarlos para que no sean avariciosos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (${$html} =~ m{<div id="cuerpo_[0-9]+" class="cuerpo">(.*?)</div>}sig) {
  2.     print "Encontrado [$1]\n\n";
  3.     print '-' x 80, "\n";
  4.     print "\n";
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con el comodín no avaricioso ".*?" el motor de expresiones regulares se para en la siguiente expresión que coincida con lo que sigue (</div>).

Nota también que no es necesario "escapar" buena parte de los caracteres que tenías escapados. De hecho, incluso lo tenías mal: no tenías escapado el carácter "/" de la etiqueta </div>. Fíjate que el coloreado de sintaxis de tu código te está avisando de que algo anda mal. Esa es también la razón por la cual yo uso m{}: al usar llaves en lugar de barras diagonales, no necesito escapar la barra de </div>.

Con esto capturas todo lo que contiene el <div>; aún queda saber qué o dónde es lo que quieres extraer de cada parte.
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: Primera ocurrencia en una búsqueda

Notapor makmanco » 2012-07-22 14:41 @654

¡¡¡ Muchísimas gracias, explorer, por tu tiempo y conocimientos !!!

¡¡¡¡¡GRACIAS!!!!!
makmanco
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-07-22 06:53 @328


Volver a Web

¿Quién está conectado?

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

cron