• 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 explorer » 2011-07-06 16:01 @709

Es 'small', no 'samll'.

El URL de los <a> debes tenerlas capturadas en el $1, según esa expresión regular.

Modificando un poco el patrón, se puede capturar solo el enlace:

while ($html =~ m{<a href="(.+?)"}smg) {
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

Publicidad

Re: Comparar páginas Perl

Notapor jacks » 2011-07-07 10:24 @475

Vale, es samll, pero ¿para sacar el título que hay entre <h2>(to be or not to be)?


¿No habría una forma de poner lo de class <h2 class="contentheading"> sustituirlo por algo como (~ m)? Porque no todos tienen algo al lado de h2 ni todos los que tienen class tienen el mismo valor.

Para sacar de aquí el link de href= y el título <h4> con el código este ¿qué tengo mal?

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.  <a class="cat-product" href="en/products-and-services/burg-lock-options/proconut/kategorie/anzeigen/kategorie/197/">
  2.                         <div class="pic"><img class="ie_imagefix" alt="Combination Camlocks" src="typo3temp/pics/012db5eee3.png" width="59" height="64" /></div>
  3.                         <h4 class="catlink">Combination Camlocks</h4>
  4.  
  5.                     </a>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<a class="cat-product" href=(.+?)>.+?
  2. <h4class="catlink">(.+?)<\h4></a>}smg)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y luego tengo dudas porque he probado y no me da resultado. Para poner más de un patrón y más de un while() ¿cómo es mejor, crear una lista diferente por cada patrón o meter todos los patrones en un while() con una sola lista?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<a class="cat-product" href=(.+?)>.+?<h4class="catlink">(.+?)<\h4></a>}smg) {        
  2.  
  3.         # print "[$1][$2][$3]\n";                                                      
  4.  
  5.         push(@list,{                                                                           
  6.             Link        => $1,                                                                                                                                                      title       => $2,
  7.             description => "",
  8.         });
  9.  
  10.     }
  11.    
  12.     while ($html =~ m{<h4>(.+?)</h4>.+?<p>(.+?)</p>}smg){
  13.    
  14.         # print "[$1][$2][$3]\n";                                                      
  15.         push(@list2,{                                                                          
  16.             Link        => $1,                                                                                                                         
  17.             title       => $2,
  18.             description => "",
  19.         });
  20.  
  21.     }
  22.      
  23.     return \@list,\@list2;
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 explorer » 2011-07-07 13:36 @608

jacks escribiste:Vale, es samll
Que no, que es small ;)

Creo que el problema está aquí:
while ($html =~ m{<h2 class="contentheading">(.+?)</h2>.+?<div class="samll"><p>(.+?)</p><\div>}smg){

Tienes puesto que entre </p> y </div> no hay nada, pero yo sí veo que hay algo.

jacks escribiste:pero ¿para sacar el título que hay entre <h2>(to be or not to be)?
Pues igual que lo de más, salvo que tendrás que quitar las marcas de las imágenes.

jacks escribiste:¿No habría una forma de poner lo de class <h2 class="contentheading"> sustituirlo por algo como (~ m)? Porque no todos tienen algo al lado de h2 ni todos los que tienen class tienen el mismo valor.
No sé lo que quieres decir con (~ m). Eso no es un patrón... ¿no?

jacks escribiste:Para sacar de aquí el link de href= y el título <h4> con el código este ¿qué tengo mal?

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.  <a class="cat-product" href="en/products-and-services/burg-lock-options/proconut/kategorie/anzeigen/kategorie/197/">
  2.                         <div class="pic"><img class="ie_imagefix" alt="Combination Camlocks" src="typo3temp/pics/012db5eee3.png" width="59" height="64" /></div>
  3.                         <h4 class="catlink">Combination Camlocks</h4>
  4.  
  5.                     </a>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<a class="cat-product" href=(.+?)>.+?
  2. <h4class="catlink">(.+?)<\h4></a>}smg)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
'h4' está pegado a 'class', y yo veo al menos un espacio en blanco. Y no es '\h4', sino '/h4'. Y hay espacios entre '</h4>' y '</a>'. Lo menor es no ponerlo. Es decir:

while ($html =~ m{<a class="cat-product" href="(.+?)">.+?<h4 class="catlink">(.+?)<}smg)

jacks escribiste:y luego tengo dudas porque he probado y no me da resultado. Para poner más de un patrón y más de un while() ¿cómo es mejor, crear una lista diferente por cada patrón o meter todos los patrones en un while() con una sola lista?
Se puede meter en una sola lista, con dos while(). Solo hay que seguir haciéndole push().
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-07-10 13:03 @585

Hola explorer. Tengo un pequeño problema. He estado revisando todos los programas que hice para la realización del programa que tenía que hacer y tengo unos fallos que no sé por qué me pasa:

CÓDIGOS:
(Código Update.pm)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;                           # Módulos requeridos por el sistema.
  5. use utf8;                               # Este programa está escrito en codificación utf8
  6. package Update;
  7. use Encode qw'decode';                 
  8. use base 'XML::RSS::FromHTML';
  9.  
  10. my($nombre,$link);
  11.  
  12. $nombre = $_[0];
  13. $link = $_[1];
  14.  
  15. # Subrutina  Init:
  16.  
  17. sub init {
  18.  
  19.     my $self = shift;
  20.  
  21.     # configuración
  22.  
  23.     $self->name('$nombre');                                                     # Título del RSS
  24.     $self->url('$link');                                                        # Dirección de la  página web
  25.     $self->passthru({encoding => 'iso-8859-15', encode_output => 0 });          # Condiciones de la salida
  26.     $self->debug(1);
  27.  
  28. }
  29.  
  30. # Subrutina  DefinirRSS:
  31.  
  32. sub defineRSS {
  33.  
  34.     my $self = shift;
  35.     my $xmlrss  = shift;
  36.  
  37.     # Definiciones del RSS generado:
  38.  
  39.     $xmlrss->channel(
  40.         title       => 'Fuente de titulares',           # Título de los RSS que hemos generado
  41.         description => 'Titulares de las actualizaciones realizadas por las diferentes empresas',               # Descripción de lo que hemos buscado
  42.     );
  43. }
  44.  
  45. # Subrutina CrearListaDeElementos:
  46.  
  47. sub makeItemList {
  48.  
  49.     my $self = shift;
  50.     my $html = shift;
  51.  
  52.     # Interpretamos el código HTML y crear con ello una lista:
  53.  
  54.     my @list;
  55.  
  56.      # $html = decode('iso-8859-15', $html);                                            # Codificación ha 'iso-8859-15'
  57.  
  58.     while ($html =~ m{<h4>(.+?)</h4>.+?<p>(.+?)</p>}smg){                               # Patrón por el que buscaremos las noticias
  59.  
  60.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado
  61.  
  62.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripción)                                                      
  63.             link        => $1,
  64.             title       => $2,
  65.             description => $3,
  66.         });
  67.  
  68.     }
  69.  
  70.     while ($html =~ m{<a href="(.+?)"}smg){                                             # Patrón por el que buscaremos las noticias
  71.  
  72.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado
  73.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripción)
  74.             link        => $1,
  75.             title       => $2,
  76.             description => $3,
  77.         });
  78.     }
  79.    
  80.     while ($html =~ m{<p>(.+?)</p>}smg){                                                # Patrón por el que buscaremos las noticias
  81.  
  82.         # print "[$1][$2][$3]\n";                                                       # Imprimir por  pantalla lo que hemos encontrado
  83.         push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripción)
  84.             link        => $1,
  85.             title       => $2,
  86.             description => $3,
  87.         });
  88.  
  89.     }
  90.  
  91.     return \@list;                                                                      # Devuelve la lista que hemos generado
  92. }
  93.  
  94. # Subrutina AñadirNuevoElemento:
  95.  
  96. sub addNewItem {
  97.  
  98.     my $self = shift;
  99.     my ($xmlrss,$eachItem) = @_;
  100.  
  101.     # Crear cada elemento del RSS usando el método XML::RSS->add_item
  102.  
  103.     $xmlrss->add_item(
  104.             link        => $eachItem->{link       },
  105.             title       => $eachItem->{title      },
  106.             description => $eachItem->{description},
  107.     );
  108.  
  109. }
  110.  
  111.  
  112. #### Programa principal:
  113.  
  114. package main;
  115.  
  116. #use Update;                      # No es necesario incluirle, porque está antes
  117.  
  118. my $rss = Update->new();          # Crear nuevo Marcar
  119.  
  120. $rss->update;                     # Actualizar RSS.
  121.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



(Código main.pm)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;                                   # Módulos requeridos por el sistema
  5. use utf8;                                       # Este programa está escrito en codificación utf8
  6. use Encode qw'decode';                         
  7. use base 'XML::RSS::FromHTML';
  8. use DBI;
  9. use ConectarDB;
  10. use autodie;
  11. use Modern::Perl;
  12. package main;
  13. use Update;
  14.  
  15. my($conexion,$sth,$nombre,$link);
  16.  
  17. $conexion = ConectarDB->connect();
  18.  
  19. $sth = $conexion->prepare("SELECT * FROM sector1")or die("Couldn't prepare statement: " . $conexion->errstr);;                           #desde la conexión a la base de datos  cogemos la información seleccionada    mediante el SELECT de la base de datos
  20.  
  21. $sth->execute()or die("Couldn't execute statement: " . $sth->errstr);                                                                   # Ejecutamos lo que hemos preparado en la línea anterior
  22.  
  23.  
  24. while (my $ref = $sth->fetchrow_hashref()) {                                     # Con este bucle mientras  quede algún valor en  $ref de los que seleccionamos de la base de datos y mientras  la variable encontrada sea "0" seguirá el bucle. Cuando   uno  de los dos falle se saldrá
  25.  
  26.         $nombre = $ref->{'link'};                                                #Comparamos la  primera  variable que le pasamos desde la  llamada a la subrutina  con el link cogido desde la base de datos.  Si son iguales  quiere decir que el link existe con lo cual ponemos la  variable encontrado a "1" y salimos del bucle.
  27.  
  28.         $link = $ref->{'nombre'};
  29.  
  30.         printf ("$ref->{'nombreEmpresa'}:  ");
  31.  
  32.         printf ("$ref->{'link'}\n");
  33.  
  34.  
  35.         my $rss = Update->new($nombre,$link);
  36.  
  37.         my $hasNewItem = $rss->update;
  38.  
  39.  
  40.  
  41.         if($hasNewItem){
  42.  
  43.                 print "RSS updated with some new items";
  44.  
  45.                 return 1;
  46.  
  47.         }else{         
  48.                 print $rss->updateStatus;
  49.  
  50.                 return undef;
  51.         }
  52. }
  53.  
  54. $sth->finish();
  55.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



DUDA:
1) ¿No he podido probar ha ejecutar main.pm porque me dice:"Update.pm did not return a true value at main.pm line 14" y cuando abro el script main.pm me marca en rojo "use update;" ¿Por qué es?

2) ¿Crees que recibirá bien la información el update.pm de main.pm? me refiero al nombre y a la url.

3) En la parte final de Update.pm aparece package main y luego en main.pm también lo pongo ¿debería quitarlo de alguna de las dos?

4) Puede que en la base de datos haya más de un sector y cada uno contendrá links con lo cual ¿ para hacer un select de la base de datos se podrían seleccionar las diferentes tablas que tiene esa DB para pasarle los nombres de cada una de ellas al select de la línea 19 (main.pm)?

Bueno y para finalizar me pidieron que este martes si podría enseñar cómo actualiza las páginas web, esto es como lo que hace los programas hasta ahora, y tenía pensado hacerlo con las 5 URL que te pasé pero hay algunas que seguro no me genera las actualizaciones porque no pude encontrar el patrón de búsqueda adecuado. Me preguntaba si me podrías echar una mano con esa parte, solo un vistazo. He puesto los patrones de búsqueda que más o menos pertenecen a cada una de las 5 páginas porque no puedo hacer lo que me propusiste de usar diferentes módulos para cada una de las páginas puesto que puede darse el caso de que introduzca una página web y a esa página el programa debería asignarle un módulo por defecto y sería un lio; por eso de esta manera usando cada patrón para todas las páginas alguna coincidirá y creará las noticias. No se me ocurre otra posibilidad y me preguntaba si podrías decirme algún patrón más de búsqueda aunque sea de dos páginas. Gracias (siento haber contado mi vida :oops: )
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor jacks » 2011-07-11 04:47 @241

Si pudieran responderme aunque sea breve, es que tendría que mostrarlo mañana. Gracias :oops:
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-11 06:25 @309

jacks escribiste:1) ¿No he podido probar ha ejecutar main.pm porque me dice:"Update.pm did not return a true value at main.pm line 14" y cuando abro el script main.pm me marca en rojo "use update;" ¿Por qué es?
Cuando se carga un módulo, Perl lo evalúa, y espera que la última instrucción ejecutada en el módulo devuelva un valor verdadero. Por eso, en casi todos los módulos, aparece un "1;" como última línea del módulo. Ponla.

jacks escribiste:2) ¿Crees que recibirá bien la información el update.pm de main.pm? me refiero al nombre y a la url.
No lo creo. No es tan sencillo hacerlo. El trabajo de la personalización se hace en el init(), pero no veo manera de que el programa pase argumentos al módulo. O al menos, de una forma sencilla.

jacks escribiste:3) En la parte final de Update.pm aparece package main y luego en main.pm también lo pongo ¿debería quitarlo de alguna de las dos?
El package main es el programa principal. No debería estar en el fichero del módulo. El primer ejemplo que puse en este hilo sí que aparecía porque era un único código fuente, por lo que era necesario separar la parte del módulo de la parte del programa. Pero estando en ficheros distintos, no sería necesario usar package main.

jacks escribiste:4) Puede que en la base de datos haya más de un sector y cada uno contendrá links con lo cual ¿para hacer un select de la base de datos se podrían seleccionar las diferentes tablas que tiene esa DB para pasarle los nombres de cada una de ellas al select de la línea 19 (main.pm)?
Pues no lo sé... no estoy muy puesto en temas de SQL.

jacks escribiste:pero hay algunas que seguro no me genera las actualizaciones porque no pude encontrar el patrón de búsqueda adecuado. Me preguntaba si me podrías echar una mano con esa parte, solo un vistazo.
Si se de trata de un vistazo de 30 segundos, 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: Comparar páginas Perl

Notapor jacks » 2011-07-11 07:21 @348

Vale, gracias, explorer. Si al final puedes echarle el vistazo en 30 segundos pues te lo agradecería. Ya puse el 1; al final y no da ese error pero tendré que investigar a ver cómo pasarle los parámetros desde main porque eso lo he probado y no los recoge.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor jacks » 2011-07-11 10:59 @499

Si no te da tiempo a mirarlo para hoy no pasa nada. Al final no lo tengo que demostrar hasta el miércoles; vale.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-11 18:54 @829

Yo lo veo fatal... en la línea 70 pones
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<a href="(.+?)"}smg){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

en donde se ve que hay un paréntesis de captura, para capturar el href de cualquier enlace de la página.

Esto plantea dos problemas: en casi cualquier página hay enlaces, por lo que este bucle capturará un montón de cosas que seguro que no te interesan que sean tus títulos de noticias. Y segundo, solo tienes un par de paréntesis de captura, pero en las líneas siguientes haces referencia a $2 y $3, que en ese caso no tienen ningún valor.

Y lo mismo pasa en la línea 80.
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-07-12 16:57 @748

Vale, ya lo solucioné. Tengo algunas preguntas:

1)
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. </div><div id="contentrightportlets" class="x-portlet-area portlet-content sub-content"><div class="general-portlet first-portlet last-portlet x-portlet">
  2.  
  3. <img src="/Global/Quote_26x21.gif" alt="" class="image-align-left" />
  4. <p>Customers look to trusted leaders in access control and identification for solutions and products that are influenced by IT standards, that have enhanced security features and are enabled by technology that allows for contactless access and transaction applications.</p>
  5. <p><em>Denis Hebert<br />President and CEO<br />HID Global</em></p>
  6. </div></div>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quiero sacar la descripción de las <p> pero, claro, si utilizo +.?<p>(.+?)< me sacará cosas que están entre esas etiquetas que no quiero. ¿Qué puedo hacer para que me salga solo éstas?

2) Quiero sacar el título y la descripción de aquí pero en el título me saca lo siguiente ¿Cómo hago para sacar el título?
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          {
            'title' => '<a href="/en/com/Site/Search/">Search</a>',
            'description' => 'Security monitoring and access control without physical contact – made possible by RFID-enabled ASSA ABLOY products. ',
            'Link' => ''
          }
        ];
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<h2>(.+?)</h2>.+?<p class="preamble">(.+?)</p>}smg) {
  2.  
  3. push(@list,{                                                                    # La lista de los elementos (Título, Link, Descripcion).
  4.        
  5.             Link        => "",                                                                                 
  6.             title       => $1,
  7.             description => $2,
  8.         });
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <h2>Access control and identification</h2>
  2.                                                         <p class="preamble">Security monitoring and access control without physical contact – made possible by RFID-enabled ASSA ABLOY products. </p>
  3.  
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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