• Publicidad

Obtener datos de una web

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Obtener datos de una web

Notapor amquilez » 2011-03-02 07:53 @370

Hola a todos.

Estoy intentado obtener unos datos de plantas solares de una página web y me he atascado. La verdad que comienzo con esto del Perl y me está costando mucho.

He conseguido obtener todos los enlaces de las plantas pero ahora es cuando no sé cómo continuar. Tengo que obtener de cada planta el nombre, la localidad y la potencia.

El código que tengo es

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use WWW::Mechanize;
  7.  
  8. my $mech = WWW::Mechanize->new();
  9.  
  10. my $n=0;
  11. while ($n <= 945)
  12. {
  13.         # Página de dónde partimos
  14.         my $url="http://www.rankingsolar.com/parques-solares.html?start=";
  15.  
  16.         $mech->get( $url.$n );
  17.  
  18. # Recorremos todos los enlaces válidos
  19. foreach my $enlace ( $mech->links() ) {
  20.         if(($enlace->text() =~ m/Parque Solar/) || ($enlace->text() =~ m/Parque Termosolar/)){
  21.                 print $enlace->text(), "->", $enlace->url(), "\n";
  22.         }
  23.  
  24. }
  25. $n+=9;
  26.  
  27. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Muchas gracias por la ayuda.
amquilez
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-03-02 07:47 @366

Publicidad

Re: Obtener datos de una web

Notapor explorer » 2011-03-02 08:20 @389

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

Una vez que sabes el URL a donde quieres ir, solo tienes que hacer otro get() para "saltar" a esa página:

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $pagina_detalles = WWW::Mechanize->new();
  2.     $pagina_detalles->get( $enlace->url() );
  3.  
  4.     # (aquí interpretamos el contenido de la $pagina_detalles)
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener datos de una web

Notapor amquilez » 2011-03-02 09:24 @433

Muchas gracias por la respuesta tan rápida.

Más o menos ya sabía lo que tenía que hacer a continuación. El problema viene en que no sé cómo tratar esa página que me traigo.

He mirado por ahí y he visto algo sobre cómo obtener datos de tablas. Lo que pasa es que los datos que tengo que sacar vienen entre etiquetas de HTML y ahí sí que estoy perdido. Al final de atravesar varios <div class=....> llego a donde realmente tengo la información que está entre etiquetas <ul> y <li> y aquí es donde estoy perdido, no sé cómo hacer este proceso.
amquilez
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-03-02 07:47 @366

Re: Obtener datos de una web

Notapor explorer » 2011-03-02 11:01 @501

Bueno, hay que escarbar un poco en el código y aplicar unas expresiones regulares sencillas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Perl6::Slurp;
  3.  
  4. my $pagina = slurp 'kk.html';            # para la prueba, leemos la página desde el disco
  5.  
  6. my($parque_nombre) = $pagina =~ m{contentpagetitle .*? > \s* (.+?) \s* <}msx;
  7.  
  8. print "[$parque_nombre]\n";
  9.  
  10. my($situacion)     = $pagina =~ m{SITUACION .+? <ul> (.+?) </ul> }msx;
  11.  
  12. my @situacion      = $situacion =~ m{<li> (.+?) </li>}gmsx;
  13.  
  14. #say "[$situación]";
  15. print "[", join(q'][', @situacion), "]\n";
  16.  
  17. my($potencia)      = $pagina =~ m{POTENCIA .+? <li> (.+?) </li>}x;
  18.  
  19. print "[$potencia]\n";
  20.  
  21. __END__
  22. [Parque Solar Olmedilla de Alarcon]
  23. [Olmedilla de Alarcon][Cuenca][Castilla la Mancha<p>&nbsp;</p> ]
  24. [60MW]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo principal es ver dónde podemos echar el ancla a donde poder agarrarnos, dentro de la página, y a partir de ahí, extraer la información que nos interesa.

En este caso, usamos 'contentpagetitle', 'SITUACION' y 'POTENCIA', pues parece que no se repiten más que una sola vez en toda la página.

Luego, es cuestión de aplicar patrones a lo que sigue a esas anclas.

Casi siempre usamos .*? o .+? para posicionarnos en el punto donde queremos empezar a extraer, que es justo después de otro literal, como '<li>' o '<ul>'. Y capturamos lo que sigue con (.+?), hasta el siguiente literal de cierre.

Por otra parte, en una cuestión legal, recuerda que tienes que respetar el copyright de la página. Es posible que no puedas hacer uso de esos datos sin el consentimiento de sus dueños.
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: Obtener datos de una web

Notapor amquilez » 2011-03-03 03:02 @168

Muchas gracias.

Lo que más me ha costado ha sido el tema de posicionarte en la página. El uso de expresiones regulares ya lo conocía de antemano. Hasta que se conoce un nuevo lenguaje cuesta un poco al principio.

Saludos.
amquilez
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-03-02 07:47 @366

Re: Obtener datos de una web

Notapor amquilez » 2011-03-04 07:29 @353

He conseguido sacar los datos de las páginas pero no salen bien ni el nombre ni la potencia.
Algo debe estar mal en las expresiones regulares pero no sé el qué, porque la situación la saca bien.

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use WWW::Mechanize;

my $mech = WWW::Mechanize->new();

my $n=0;

#while ($n <= 945)
while ($n < 9)
{
# Página de dónde partimos
my $url="http://www.rankingsolar.com/parques-solares.html?start=";

$mech->get( $url.$n );

# Recorremos todos los enlaces válidos
foreach my $enlace ( $mech->links() ) {
if(($enlace->text() =~ m/Parque Solar/) || ($enlace->text() =~ m/Parque Termosolar/)){

my $pagina_detalles = WWW::Mechanize->new();

my $next_url = "http://www.rankingsolar.com/parques-solares" . $enlace->url();

$pagina_detalles->get( $next_url );

# Interpretamos el contenido de la $pagina_detalles
my $content = $pagina_detalles->content();

# Obtenemos el nombre del parque
my $parque_nombre = $content =~ m(contentpagetitle .+? > \s* <)msx;

print "[$parque_nombre]\n";

# Obtenemos la situación del parque
my ($situacion) = $content =~ m{SITUACION .+? <ul> (.+?) </ul> }msx;

my @situacion = $situacion =~ m{<li> (.+?) </li>}gmsx;

print "[", join(q'][', @situacion), "]\n";

# Obtenemos la potencia del parque
my $potencia = $content =~ m{POTENCIA .+? <li> (.+?) </li>}x;

print "[$potencia]\n";
}
}
$n+=9;

}
amquilez
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-03-02 07:47 @366

Re: Obtener datos de una web

Notapor explorer » 2011-03-04 07:38 @359

Te faltan los paréntesis en el my() de $potencia.

Te faltan los paréntesis de captura dentro de la exp. reg. del nombre del parque.
Y los paréntesis en el my() en el nombre del parque.
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


Volver a Básico

¿Quién está conectado?

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