• Publicidad

Comparar páginas Perl

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

Re: Comparar páginas Perl

Notapor jacks » 2011-07-30 05:47 @282

El que recorre toda la hoja .cache. Usé el método que puse ahí arriba pero no me funcionó. Por eso preguntaba.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Publicidad

Re: Comparar páginas Perl

Notapor explorer » 2011-07-30 05:57 @289

¿Qué error sale? ¿Cuántos bytes tiene?

Ese fichero lo leerá el módulo para llevar un control de los titulares pasados, para no repetirlos en el siguiente RSS que genere.

Con el eval(), yo lo he leído sin problemas. No es más que un fichero de texto.
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: Comparar páginas Perl

Notapor jacks » 2011-08-18 07:20 @347

Hola explorer. He estado terminando el programa principal con todos los pequeños programas que hemos comentado en el foro y creo que más o menos está bien:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package main;
  4.  
  5. use warnings;                          # Módulos requeridos por el sistema.
  6. use utf8;                              # Este programa está escrito en codificación utf8
  7. use Encode qw'decode';
  8. use base 'XML::RSS::FromHTML';
  9. use DBI;
  10. use ConectarDBRSS;
  11. use autodie;
  12. use Modern::Perl;
  13. use ConectarDBabrir;
  14. use Update;
  15.  
  16. sub comprobarDB {
  17.     my $db = $_[0];
  18.  
  19.     my @databases = DBI->data_sources(
  20.         "mysql", { host => 'localhost', user => 'root', password => 'password' }
  21.     );                                 # Cogemos la lista de bases de datos presentes en el sistema.
  22.  
  23.     my $base_datos = $db;              # Introducimos el nombre de la  base de datos que queremos comprobar
  24.                                        # que está  en la variable $base_datos.
  25.  
  26.     my $dsn = "DBI:mysql:$base_datos"; # Conformamos el DSN de esa base de datos.
  27.  
  28.     unless ( $dsn ~~ @databases ) {    # Si el $dsn no está entre las @databases la creamos.
  29.  
  30.         my $drh = DBI->install_driver( # Carga del controlador mysql
  31.             "mysql"
  32.         );
  33.  
  34.         my $rc = $drh->func(           # Creamos la base de datos.
  35.             "createdb", $base_datos, 'localhost', 'root', 'password', 'admin'
  36.         );                            
  37.     }
  38. }
  39.  
  40. sub crearTabla {
  41.     my $conexion = $_[1];              # Desde la llamada a la subrutina le pasamos la  conexión a  la base de
  42.                                        # datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  43.  
  44.     my $tabla = $_[0];
  45.  
  46.     eval {
  47.         $conexion->do(
  48.           "CREATE TABLE $tabla (link VARCHAR(200), titulo VARCHAR(300), descripcion VARCHAR(500), codigo INTEGER)"
  49.         );
  50.     };                                 # Hacemos un eval, cuya función será dejar que la tabla se cree o no
  51.                                        # dependiendo de si existe, y desde la conexión a la  base de datos
  52.                                        # crearemos la tabla,  si  no existe  ya.
  53.  
  54.     if ($@) {
  55.         printf("La tabla existe \n");  # Se captura el error si la tabla existe y
  56.                                        # nos dice que "La  tabla  existe".
  57.     }
  58. }
  59.  
  60. sub insertar {
  61.     printf("estoy  en insert");
  62.  
  63.     my ( $conexion, $sth, $tabla, $link, $descripcion, $titulo );   # Variables que usaremos para recoger los
  64.                                                                     # parámetros de entrada desde la llamada a
  65.                                                                     # la subrutina.
  66.  
  67.     $titulo = $_[3];
  68.     $descripcion = $_[4];
  69.     $conexion = $_[2];      # Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos.
  70.                             # Desde la llamada  sería la  cuarta variable  que le pasamos.
  71.  
  72.     $tabla = $_[1];
  73.     $link = $_[0];
  74.     printf("$link\n");
  75.  
  76.     $sth = $conexion->prepare("INSERT INTO $tabla(link,titulo,descripcion) VALUES (?,?,?,?)")
  77.         or die( "Couldn't prepare statement: " . $conexion->errstr )
  78.         ;                   # Desde la conexión a la base de datos  insertamos en la  tabla, cuyo nombre le
  79.                             # pasamos desde la llamada  a la subrutina en la  posición tercera, la información
  80.                             # que después le proporcionamos. Si no existe la tabla  sale con la  funcion "die".
  81.  
  82.     $sth->execute( $link, $titulo, $descripcion )
  83.         or die( "Couldn't execute statement: " . $sth->errstr )
  84.         ;                   # se procesa la orden ejecutar insertando los valores pasados en la llamada
  85.                             # a la subrutina en las posiciones primera y segunda. Si no se puede insertar
  86.                             # sale con la  función "die".
  87.  
  88.     $sth->finish;
  89. }
  90.  
  91. &comprobarDB("abrir");                               # Llamada a subrutina CompararDB.
  92.  
  93. my ( $conexion, $conexion2, $sth, $cont, $tabla );   # Declaración de las  variables que utilizaremos a continuación.
  94.  
  95. $conexion = ConectarDBabrir->connect();              # Conectamos con la  base de datos desde el paquete
  96.                                                      # ConectarDB y lo dejamos en la variable $dbh.
  97.  
  98. $sth = $conexion->prepare("show tables") or die( "Couldn't prepare statement: " . $conexion->errstr );
  99. $sth->execute() or die( "Couldn't execute statement: " . $sth->errstr );
  100.  
  101. my ( $no, $li, $ti, $de );
  102. while ( my $row = $sth->fetchrow_arrayref ) {
  103.  
  104.     $tabla = join( "\t", @$row );
  105.     print("$tabla\n");
  106.  
  107.     $cont = $conexion->prepare("SELECT * FROM $tabla");   # desde la conexión a la
  108.                                                           # base de datos cogemos la
  109.                                                           # información seleccionada
  110.                                                           # mediante el SELECT de la
  111.                                                           # base de datos.
  112.  
  113.     $cont->execute();         # Ejecutamos lo que hemos preparado en la linea anterior.
  114.  
  115.     while ( my $ref = $cont->fetchrow_hashref() ) {
  116.                                # Con este bucle mientras  quede algún valor en  $ref
  117.                                # de los que seleccionamos de la base de datos y mientras
  118.                                # la variable encontrado sea "0" seguirá el bucle. Cuando
  119.                                # uno  de los dos falle se saldrá.
  120.  
  121.         $li = $ref->{'link'};  # Comparamos la  primera  variable que le pasamos
  122.                                # desde la  llamada a la subrutina  con el link
  123.                                # cogido desde la base de datos.  Si son iguales
  124.                                # quiere decir que el link existe con lo cual ponemos
  125.                                # la  variable encontrado a "1" y salimos del bucle.
  126.  
  127.         $no = $ref->{'nombreEmpresa'};
  128.         $cont->finish();
  129.         $ti = "Fuente de noticias";
  130.         $de = "titulares de las actuaciones";
  131.         my $rss = Update->new( $no, $li, $ti, $de );
  132.         my $hasNewItem = $rss->update;
  133.         if ($hasNewItem) {
  134.             print "RSS se ha  actualizado con nuevos elementos";
  135.             return 1;
  136.         }
  137.         else {
  138.             print $rss->updateStatus;
  139.             return undef;
  140.         }
  141.  
  142.         &comprobarDB("Rss");
  143.         $conexion2 = ConectarDBRSS->connect();     #  Conectamos con la  base de datos
  144.                                                    # desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  145.  
  146.         my ( $archivo, $copia_archivo, $link, $titulo, $descripcion );
  147.         $archivo = read_file("Marca.cache");
  148.         $copia_archivo = eval $archivo;
  149.         my $cont = 0;
  150.         &crearTabla( $tabla, $conexion2 );
  151.         while (<$archivo>) {
  152.             $link = $copia_archivo->[$cont]->{link};
  153.             print $copia_archivo->[$cont]->{link};
  154.             $titulo = $copia_archivo->[$cont]->{title};
  155.             print $copia_archivo->[$cont]->{title};
  156.             $descripcion = $copia_archivo->[$cont]->{description};
  157.             print $copia_archivo->[$cont]->{description};
  158.             &insertar( $link, $tabla, $conexion2, $titulo, $descripcion );
  159.             $cont = $cont + 1;
  160.         }
  161.  
  162.         $conexion2->disconect;
  163.     }
  164. }
  165. $conexion->disconect;
  166.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Las dudas que tengo son las siguientes:

1.- He declarado dos variables ($conexion, $conexion2) para que me permita conectarme a las dos bases de datos a la vez. ¿Está bien así o sería mejor conectarme a la primera base de datos cargar los datos en una Hash y después conectarme a la segunda base de datos?

2.- A partir de la línea 136 lo que hago es leer el .cache y pasárselo a la variable $copia_archivo. Pero lo que te pregunté en el anterior post es: ¿cómo recorro hasta el final la variable $copia_archivo? ¿Está bien con el while() y utilizando el contador para acceder a cada una de las noticias?
Última edición por explorer el 2011-08-18 12:03 @544, editado 1 vez en total
Razón: Formateado de código con Perltidy y formateado de comentarios
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-08-18 13:59 @624

Las líneas 63 a 73 se pueden resumir en estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my ( $link, $tabla, $conexion, $titulo , $descripcion) = @_;    # Variables que usaremos para recoger los
  2.                                                                     # parámetros de entrada desde la llamada a
  3.                                                                     # la subrutina.
  4.     my $sth;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sigo sin entender porqué usas una base de datos para comprobar si ha habido cambios... :cry: La misión del módulo es justamente esa: generar un nuevo RSS a partir de los nuevos cambios, y ya se encarga él de saber cuáles son. :roll: :? :? :?


En fin, el programa es tan largo y complejo que no veo la forma de decirte si eso funciona o no. Lo mejor es que lo pruebes paso a paso (lo ejecutas hasta un punto y ves si lo ha hecho bien. Si no, se arregla, si sí, se avanza un poco más).

La respuesta a la preguntas: :arrow:
1.- Si funciona, sí.

2.- En cuanto al fichero caché... ese fichero ya lo has leído en la línea 147, así que no hay porqué volverlo a leer en la 151...

Si el eval() de la línea 148 ha funcionado, lo que hay en la variable $copia_archivo es la estructura hash de array que almacena los titulares recuperados. Veo que usas print() para asegurarte de que lo estás haciendo bien. La forma de recorrer los distintos valores, como es un array, se puede hacer de forma consecutiva, con un for():

for my $entrada (@{$copia_archivo}) {
print $entrada->{description}, "\n";
# ...
}
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: Comparar páginas Perl

Notapor jacks » 2011-08-18 15:04 @669

Lo que pasa que quiero mantener un historico. Es decir quiero almacenar los RSS para cuando quiera hacer copia del historial.

Con este codigo entonces recorreria todo el archivo no?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $archivo = read_file("Marca.cache");
  2.  
  3. $copia_archivo = eval $archivo;  
  4.  
  5. &crearTabla($tabla,$conexion2);
  6.  
  7. for my $entrada (@{$copia_archivo}) {
  8.                
  9.         $link = $entrada->{link};
  10.         print $entrada->{link}, "\n";
  11.                
  12.         $titulo  = $entrada->{title};  
  13.         print $entrada->{title}, "\n";
  14.                
  15.         $descripcion = $entrada->{description};
  16.         print $entrada->{description}, "\n";
  17.                
  18.                              &insertar($link,$tabla,$conexion2,$titulo,$descripcion);
  19.                
  20. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor jacks » 2011-08-26 05:57 @289

¿Por qué cuando recorro el archivo me lee tanto el título como la descripción pero no me lee nunca el link? Ya sé que hay algunas noticias que no tienen link pero las que tienen no me los lee.

$VAR1 = [
{
'title' => '<a href="/en/com/Site/Search/">Search</a>',
'description' => 'In our Newsroom you can find the latest news and press releases, our videos and images for download.',
'Link' => ''
},
{
'title' => 'In our Newsroom you can find the latest news and press releases, our videos and images for download.->Opening doors to life video – protecting water',
'description' => '',
'Link' => '/en/com/News/News/2011/News-2011/Opening-doors-to-life-video--protecting-water/'
},
{
'title' => '24 Aug 2011->KESO to install locking systems at all Kaufland hypermarkets',
'description' => '',
'Link' => '/en/com/News/News/2011/News-2011/KESO-to-install-locking-systems-at-all-Kaufland-hypermarkets/'
}
];

Los leo de la siguiente manera:

my $x = read_file("AssaAbloy_NewsRoom.cache");

my $y = eval $x;

for my $entrada (@{$y}) {


print "Link: ",$entrada->{link}, "\n";

print "Titulo: ",$entrada->{title}, "\n";

print "Descripcion: ",$entrada->{description}, "\n";

}
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-08-26 09:36 @441

Yo veo que en la estructura de datos, 'Link' está escrito con la primera letra en mayúsculas...
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: Comparar páginas Perl

Notapor jacks » 2011-08-26 11:06 @504

Hola, tengo un problemilla que, con solucionarlo, ya tendré acabado el programa pero no sé si es grave. Cuando ejecuto el código, como te dije en otro post, me sale un error a la hora de generar los RSS de las páginas pero el archivo .cache lo genera correctamente. El problema es que cuando se ejecuta la llamada al programa de actualizar.pm desde el programa main.pl, surge el error, genera el .cache pero el programa principal main.pl desde el que se ha realizado la llamada deja de funcionar, no continua haciendo las demás tareas. Se me ocurrió crear una subrutina para, de esta manera, igual si se ejecuta el programa Actualizar.pm en la subrutina, al dar el error saldría de la subrutina pero continuaría ejecutando el programa main.pl. No sé si estará bien explicado pero si no es así lo volveré a explicar. :wink:

Main.pl:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3.  
  4. use DBI;
  5. use ConectarDBRSS;
  6. use autodie;
  7. use Data::Dumper;
  8. use File::Slurp;
  9. use Update;
  10.  
  11.  
  12.  
  13. sub actualizar{
  14.    
  15.     my ($empresa, $conexion, $url)= @_;
  16.    
  17.     my $titulo = "Fuente de noticias";
  18.  
  19.     my $descripcion = "Titulares de las actualizaciones";
  20.  
  21.     my $rss = Update->new($empresa,$url,$titulo,$descripcion);
  22.    
  23.     my $hasNewItem = $rss->update;
  24.                      
  25. }
  26. sub introducir ...
  27.  
  28. sub comprobarDB ...
  29.  
  30. sub  tabla ...
  31.  
  32.  
  33. &comprobarDB("rss");
  34.    
  35. my $conexion = ConectarDBRSS->connect();
  36.  
  37. my  $empresa = "AssaAbloy";
  38.  
  39. my $url = "http://www.assaabloy.com/en/com/News/";
  40.  
  41. &actualizar($empresa, $conexion, $url);
  42.  
  43. &tabla($empresa, $conexion);
  44.  
  45. my($archivo,$copia_archivo,$link,$title,$description);
  46.  
  47. $archivo = read_file("AssaAbloy.cache");
  48.  
  49. $copia_archivo = eval $archivo;
  50.  
  51. for my $entrada (@{$copia_archivo}) {
  52.                
  53.         $link = $entrada->{Link};
  54.         print $entrada->{Link}, "\n";
  55.                
  56.         $title  = $entrada->{title};   
  57.         print $entrada->{title}, "\n";
  58.                
  59.         $description = $entrada->{description};
  60.         print $entrada->{description}, "\n";
  61.                
  62.         &introducir($link,$empresa,$conexion,$title,$description);
  63.                
  64. }
  65.                
  66. $conexion->disconnect;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y el error es el que ya puse, pero vamos, que lo genera el .cache. Será por algo de tildes o no sé:
Adjuntos
error.JPG
error.JPG (116.51 KiB) Visto 676 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor jacks » 2011-08-29 15:04 @669

¿Alguien podría ayudarme y decirme cómo poder arreglar eso para que no pare el programa aunque de error? No sé capturar el error igual o no sé. Alguna idea por favor
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-08-29 15:14 @676

Si se trata de capturar errores, lo puedes hacer con el eval(), como ya está explicado unos mensajes antes...
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron