• Publicidad

Extraer contenido específico

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

Extraer contenido específico

Notapor jimr1984 » 2016-02-19 15:10 @674

Hola a todos por favor si pueden ayudarme, con una expresión regular o alguna forma de extraer cierto contenido. Paso a detallar.

URL que utilizo, método POST: http://www.cual-es-mi-ip.net/geolocalizar-ip-mapa direccion-ip = 200.58.44.25

NOTA: no he visto que pueda ser algo ilegal lo que se está solicitando.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub GEOLOCALIZAR {
  2.    my ($ipd) = @_;
  3.    my $url = "http://www.cual-es-mi-ip.net/geolocalizar-ip-mapa";
  4.    my $ua = LWP::UserAgent->new();
  5.    my $req = HTTP::Request->new(POST => $url) ;
  6.    my $post_data = "direccion-ip=".$ipd;
  7.       $req->content_type('application/x-www-form-urlencoded');
  8.       $req->content($post_data);
  9.  
  10.    my $resp = $ua->request($req);
  11.    my $message = $resp->content();  # <---- el contenido de la web lo guardo en $message   ¡OJO! tiene multilíneas
  12.    &EXTRAER_INFORMACION($message);
  13. }
  14.  
  15. sub EXTRAER_INFORMACION
  16. {
  17.     my ($contenido) = @_;
  18.    my ($pais,$ciudad,$latitud,$longitud,$isp);
  19.     if ($contenido =~ / AQUI EL FILTRO/)
  20.     {
  21.      print $pais = $1;
  22.      print $ciudad= $2;
  23.      print $latitud= $3;
  24.      print $longitud= $4;
  25.      print $isp= $5;
  26.     }
  27. }
  28.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El código fuente de la web es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <div class="panel panel-default">
  2.                     <div class="panel-body">
  3.                         <div class="row">
  4.                             <div class="col-md-12">
  5.                                 <table class="table table-striped">
  6.                                     <tbody>
  7.                                     <tr>
  8.                                         <td>País</td>
  9.                                         <td><strong>United States</strong></td>
  10.                                     </tr>
  11.                                     <tr>
  12.                                         <td>Ciudad</td>
  13.                                         <td><strong></strong></td>
  14.                                     </tr>
  15.                                     <tr>
  16.                                         <td>Latitud</td>
  17.                                         <td id="latitud" data-latitud="38"><strong>38</strong></td>
  18.                                     </tr>
  19.                                     <tr>
  20.                                         <td>Longitud</td>
  21.                                         <td id="longitud" data-longitud="-97"><strong>-97</strong></td>
  22.                                     </tr>
  23.                                     <tr>
  24.                                         <td>ISP</td>
  25.                                         <td><strong>Verizon Business</strong></td>
  26.                                     </tr>
  27.                                     </tbody>
  28.                                 </table>
  29.                             </div>
  30.                         </div>
  31.                     </div>
  32.                 </div>
  33.             </div>
  34.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Por favor, necesito extraer la información que devuelve la página, solo los valores de los campos que señalé.
¿Cómo puedo hacerlo o resolverlo?

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

Publicidad

Re: Extraer contenido específico

Notapor explorer » 2016-02-19 19:19 @846

Bueno, el problema es sencillo porque la información está rodeada de las mismas marcas: están dentro de celdas <td> y remarcadas con <strong>, así que eso es lo que tenemos que buscar con la expresión regular.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use feature 'say';
  3.  
  4. my $HTML = <<EOHTML;
  5. <div class="panel panel-default">
  6.     <div class="panel-body">
  7.         <div class="row">
  8.             <div class="col-md-12">
  9.                 <table class="table table-striped">
  10.                     <tbody>
  11.                         <tr>
  12.                             <td>País</td>
  13.                             <td><strong>United States</strong></td>
  14.                         </tr>
  15.                         <tr>
  16.                             <td>Ciudad</td>
  17.                             <td><strong></strong></td>
  18.                         </tr>
  19.                         <tr>
  20.                             <td>Latitud</td>
  21.                             <td id="latitud" data-latitud="38"><strong>38</strong></td>
  22.                         </tr>
  23.                         <tr>
  24.                             <td>Longitud</td>
  25.                             <td id="longitud" data-longitud="-97"><strong>-97</strong></td>
  26.                         </tr>
  27.                         <tr>
  28.                             <td>ISP</td>
  29.                             <td><strong>Verizon Business</strong></td>
  30.                         </tr>
  31.                     </tbody>
  32.                 </table>
  33.             </div>
  34.         </div>
  35.     </div>
  36. </div>
  37. EOHTML
  38.  
  39. my($pais, $ciudad, $latitud, $longitud, $isp) =
  40.     $HTML =~
  41.             m{
  42.                 <td .+? >
  43.                 <strong>
  44.                 (.*?)
  45.                 </strong>
  46.                 </td>
  47.             }msxg;
  48.  
  49. say "$pais, $ciudad, $latitud, $longitud, $isp";  # United States, , 38, -97, Verizon Business
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extraer contenido específico

Notapor jimr1984 » 2016-02-24 14:52 @661

Muchas gracias por la ayuda, pero NO comprendo esta parte:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~
  2.             m{
  3.                 <td .+? >
  4.                 <strong>
  5.                 (.*?)
  6.                 </strong>
  7.                 </td>
  8.             }msxg;   # <... esto no comprendo  ¿ msxg ?
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿esto sería de otra forma?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m/\<td.+?\>\<strong\>(.*?)\<\/strong\>\<\/td\>/g
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Extraer contenido específico

Notapor explorer » 2016-02-24 16:33 @731

Sí, es lo mismo, pero usas demasiadas \barras \diagonales \inversas :wink:

Más en concreto: en Perl no necesitas "escapar" con barras a los caracteres '<' y '>', con lo que tu exp. reg.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m/\<td.+?\>\<strong\>(.*?)\<\/strong\>\<\/td\>/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
se queda en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m/<td.+?><strong>(.*?)<\/strong><\/td>/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aún tenemos que usar un par de barras diagonales inversas debido a la presencia de barras normales '/' que se podrían confundir con los delimitadores del patrón, lo cual es... un fastidio. Y como somos programadores de Perl, no nos gusta eso. Así que... rompemos las reglas, cambiando los delimitadores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m{<td.+?><strong>(.*?)</strong></td>}g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ahora, con las llaves, Perl ya sabe que las barras diagonales son puro texto, no delimitadores. Pero... ahora hay otro tipo de problemas.

¿Estamos completamente seguros que entre los caracteres con los que los comodines '.' coinciden no debería haber caracteres de fin de línea? A fin de cuentas, esto es HTML, y puede haber caracteres de fin de línea en cualquier parte, sin que la presentación visual -para el usuario- cambie.

Entonces, podemos tener la precaución de decir que los '.' también coincidan con los caracteres de fin de línea. Eso lo conseguimos añadiendo la opción '/s' al final del patrón. Además, solo por costumbre, es también bueno poner la opción '/m', que le da un significado nuevo a las anclas '^' y '$', aunque en este patrón ni aparezcan. Pero es bueno porque así le es más fácil de aprender exp. reg. a los novatos.

La opción '/g' es para que aplique el patrón de forma repetida, a lo largo de todo $HTML. El resultado de la exp. reg. será una lista de elementos, cada uno de los cuales contendrá lo capturado por los paréntesis.

Finalmente, queda la opción '/x', que permite escribir el patrón con espacios, para que quede mejor formateado, más bonito. Incluso hasta podemos poner comentarios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~
  2.         m{
  3.             <td .+? >   # buscamos una marca de inicio de celda de tabla
  4.             <strong>    # que contenga una marca de negrita
  5.             (.*?)       # capturamos todo lo que haya, hasta la próxima
  6.             </strong>   # marca de fin de negrita
  7.             </td>       # que preceda a una marca de fin de celda
  8.          }msxg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora que lo veo... sobra la parte '</td>'. De hecho, se puede quedar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m/<td.+?><strong>(.*?)</sg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para terminar... si quieres puedes aumentar la robustez de la exp. reg., por si en el futuro cambiase un poco el formato HTML de esa página. Supongamos que le añaden espacios en blanco, a veces, por descuido, entre las marcas HTML. Entonces es mejor prevenirlo con algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $HTML =~ m/<td.+?>\s*<strong>\s*(.*?)\s*</sg;
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron