• Publicidad

Problemas con extracción de datos de Web con expresión regul

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

Re: Problemas con extracción de datos de Web con expresión r

Notapor jimr1984 » 2018-09-20 18:19 @805

Buenas tardes. Publico aquí este problema para continuar con el hilo.
Por favor, si pueden ayudarme a extraer este contenido.

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.  <label for="edit-captcha-response--2" class="control-label js-form-required form-required">Pregunta matem├ítica</label>
  2.  
  3.  
  4.   5 + 0 =
  5.  
  6.       <input autocomplete="off" data-drupal-selector="edit-captcha-response" aria-describedby="edit-captcha-response--2--description" class="form-text required form-control" type="text" id="edit-captcha-response--2" name="captcha_response" value="" size="4" maxlength="2" required="required" aria-required="true" />
  7.  
  8.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El código siempre es el mismo. En las etiquetas lo único que cambia es la operación aritmética, es decir: los números

Número + Número =

y los número son del 0 a 9.

Necesito extraer 5 + 0 = para realizar la operación matemática.

¿Alguien que pueda ayudarme, por favor? Gracias.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Publicidad

Re: Problemas con extracción de datos de Web con expresión r

Notapor explorer » 2018-09-20 18:54 @829

Si en la página no hay ninguna otra combinación de etiqueta '</label>' seguida de una etiqueta '<input>', entonces la expresión regular es muy sencilla:

$pregunta = $html =~ m{</label>(.+?)<input};

Bueno, luego hay que quitar los espacios en blanco que hay por delante y por detrás de la exp. matemática.

Otra opción. Si en la página no hay ninguna otra presencia de "número + número =", entonces la solución es incluso más sencilla:

($n1, $n2) = $html =~ m{(\d)\s+[+]\s+(\d)\s+=};
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: Problemas con extracción de datos de Web con expresión r

Notapor jimr1984 » 2018-09-21 13:15 @594

Gracias, explorer. Logré extraer la información que necesitaba pero me topé con otro problema.

Tengo un texto con contenido repetido:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. Primer bloque
  2.  </div>
  3.     <div class="captcha"><input data-drupal-selector="edit-captcha-sid" type="hidden" name="captcha_sid" value="178558" /><input data-drupal-selector="edit-captcha-token" type="hidden" name="captcha_token" value="6892c18016484defccd3b3a8b8e117fa" /><div class="form-item js-form-item form-type-textfield js-form-type-textfield form-item-captcha-response js-form-item-captcha-response form-group">
  4.       <label for="edit-captcha-response" class="control-label js-form-required form-required">Pregunta matemática</label>
  5.  
  6.  
  7.   2 + 1 =
  8.  
  9.       <input autocomplete="off" data-drupal-selector="edit-captcha-response" aria-describedby="edit-captcha-response--description" class="form-text required form-control" type="text" id="edit-captcha-response" name="captcha_response" value="" size="4" maxlength="2" required="required" aria-required="true" />
  10.  
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.  
  2. Segundo bloque
  3.  
  4.  </div>
  5.     <div class="captcha"><input data-drupal-selector="edit-captcha-sid" type="hidden" name="captcha_sid" value="178558" /><input data-drupal-selector="edit-captcha-token" type="hidden" name="captcha_token" value="6892c18016484defccd3b3a8b8e117fa" /><div class="form-item js-form-item form-type-textfield js-form-type-textfield form-item-captcha-response js-form-item-captcha-response form-group">
  6.       <label for="edit-captcha-response" class="control-label js-form-required form-required">Pregunta matemática</label>
  7.  
  8.  
  9.   4 + 3 =
  10.  
  11.       <input autocomplete="off" data-drupal-selector="edit-captcha-response" aria-describedby="edit-captcha-response--description" class="form-text required form-control" type="text" id="edit-captcha-response" name="captcha_response" value="" size="4" maxlength="2" required="required" aria-required="true" />
  12.  
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Al realizar esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $tokencaptcha = $1 if  ($xcontenido =~  m/name="captcha_token" value="(\w+)/mg);
  2. my $tokenformulario = $1 if ($xcontenido =~  m/name="form_build_id" value="form-(\w+)/mg);
  3. my $suma = $2 + $3  if  ($xcontenido =~  m/(Pregunta\s.*)<\/label>\s+(\d+)\s\+\s(\d+)/mg);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

me obtiene los datos del segundo bloque y yo necesito los del primer bloque.

¿Alguna sugerencia para que solo busque la primera ocurrencia y no la segunda?

Gracias.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Problemas con extracción de datos de Web con expresión r

Notapor explorer » 2018-09-22 20:55 @913

A mí sí que me devuelve la primera ocurrencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $xcontenido = do { local $/; <DATA> };
  5.  
  6. my $tokencaptcha = $1    if $xcontenido =~  m/name="captcha_token" value="(\w+)/m;
  7. my $tokenformulario = $1 if $xcontenido =~  m/name="form_build_id" value="form-(\w+)/m;
  8. my $suma = $2 + $3       if $xcontenido =~  m/(Pregunta\s.*)<\/label>\s+(\d+)\s\+\s(\d+)/m;
  9.  
  10. say "tokencaptcha: $tokencaptcha";
  11. say "tokenformulario: $tokenformulario";
  12. say "suma: $suma";
  13.  
  14. __DATA__
  15.  
  16.      </div>
  17.         <div class="captcha"><input data-drupal-selector="edit-captcha-sid" type="hidden" name="captcha_sid" value="178558" /><input data-drupal-selector="edit-captcha-token" type="hidden" name="captcha_token" value="6892c18016484defccd3b3a8b8e117fa" /><div class="form-item js-form-item form-type-textfield js-form-type-textfield form-item-captcha-response js-form-item-captcha-response form-group">
  18.           <label for="edit-captcha-response" class="control-label js-form-required form-required">Pregunta matemática</label>
  19.  
  20.  
  21.       2 + 1 =
  22.  
  23.           <input autocomplete="off" data-drupal-selector="edit-captcha-response" aria-describedby="edit-captcha-response--description" class="form-text required form-control" type="text" id="edit-captcha-response" name="captcha_response" value="" size="4" maxlength="2" required="required" aria-required="true" />
  24.  
  25.  
  26. </div>
  27.         <div class="captcha"><input data-drupal-selector="edit-captcha-sid" type="hidden" name="captcha_sid" value="178558" /><input data-drupal-selector="edit-captcha-token" type="hidden" name="captcha_token" value="6892c18016484defccd3b3a8b8e117fa" /><div class="form-item js-form-item form-type-textfield js-form-type-textfield form-item-captcha-response js-form-item-captcha-response form-group">
  28.           <label for="edit-captcha-response" class="control-label js-form-required form-required">Pregunta matemática</label>
  29.  
  30.  
  31.       4 + 3 =
  32.  
  33.           <input autocomplete="off" data-drupal-selector="edit-captcha-response" aria-describedby="edit-captcha-response--description" class="form-text required form-control" type="text" id="edit-captcha-response" name="captcha_response" value="" size="4" maxlength="2" required="required" aria-required="true" />
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
tokencaptcha: 6892c18016484defccd3b3a8b8e117fa
tokenformulario:
suma: 3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

No sé por qué no te funciona, quizás sea un tema de espacios en blanco.

Detalles:
  • No te hace falta poner el modificador '/g'. Es más: es mejor que lo quites y que solo lo uses en exp. reg. dentro de bucles.
  • En la tercera exp. reg., tienes puesto esto: '(Pregunta\s.*)'. Ese '.*' es peligrosísimo. Quiero decir que puede ser la razón de tu fallo. En mi código, si agrego el modificador '/s' a esa exp. reg., entonces me sale la segunda suma. Es debido a que '.*' "se ha comido" todo el código HTML hasta el final, y luego ha ido hacia atrás, hasta que ha coincidido el resto del patrón. Por eso sale la última suma.
La tercera exp. reg. quedaría mejor así: m{Pregunta mate.*?</label>\s+(\d+)\s+\+\s+(\d+)}m

Como no capturamos "Pregunta ...", entonces los sumandos estarán en $1 y $2.

Observa también algo importante: hemos modificado el operador '.*', pasándolo de avaricioso a gentil, al añadirle un '?'. Ahora la búsqueda se detendrá en la primera ocasión que se cumpla el patrón, no la última. También he agregado un par de '+' a los caracteres '\s', por seguridad.
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

Anterior

Volver a Web

¿Quién está conectado?

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