• 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-04 16:59 @749

Pero... habría que identificar qué parte formará el título, qué parte será la descripción, cuál será la URL...
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-05 04:12 @216

Sí, tienes razón.
El título sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <h2>Access control and identification</h2>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La descripción, o sea, el contenido, sería esto que en la página está dividida en párrafos :

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <p class="preamble">Security monitoring and access control without physical contact – made possible by RFID-enabled ASSA ABLOY products. </p>
  2.                                 <p>The demand for ASSA ABLOY products based on RFID (Radio Frequency Identification) technology continues to grow. ASSA ABLOY products based on RFID are enabling better end-user services and improving information management for operators in market segments ranging from hospitality and education to e-government and contactless payment.&nbsp;</p>
  3. <p>Our technology <a href="/en/com/Products/Access-control-and-identification/Aperio-online-access-managment/">Aperio gives you wireless possibilities for online door control</a>. It is a new smart technology that enables doors with mechanical locks to be wirelessly linked to existing access control systems without any need to modify the door. Aperio is your answer to conveniently increased security at a competitive cost.</p>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la URL sería la que introduzco yo porque no aparece más, puesto que esta que contiene el tercer párrafo no pertenece a esta noticia sino que es un enlace a algo que se hace referencia en ese párrafo.
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-05 11:43 @529

Entonces, por cada página, debes crear una expresión regular distinta. En este caso, tienes el problema de que no sabes cuántos párrafos necesitas capturar. Supongamos que solo capturamos los 3 primeros, y además, suponemos también que siempre hay un mínimo de tres párrafos.

Con una expresión regular como la de este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;
  3. use autodie;
  4. use File::Slurp;
  5.  
  6. my $html = read_file('kk.html');
  7.  
  8. #say $html;
  9.  
  10. while ($html =~ m{<h2>(.+?)</h2>.+?<p class="preamble">(.+?)</p>.+?<p>(.+?)</p>.+?<p>(.+?)</p>}smg) {
  11.  
  12.     say "Título: [$1]";
  13.     say "Descripción: [" . $2 . $3. $4 . "]";
  14.  
  15. }
  16.  
  17. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
se extrae el título y los tres párrafos que hay después del primero que sea de una clase "preamble".

Deberás aprender algo de expresiones regulares, para poder atacar el resto de páginas.
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-05 14:29 @645

Una pregunta ¿Por qué pones my $html = read_file('kk.html'); y en el otro código no lo pusiste ?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub makeItemList {
  2.  
  3.     my $self = shift;
  4.     my $html = shift;
  5.  
  6.     my @list;
  7.  
  8.      # $html = decode('iso-8859-15', $html);                                           
  9.  
  10.     while ($html =~ m|<h2 ><a href="(.*?)" title="(.*?)".+?<p>(.+?)>|smg){             
  11.  
  12.         # print "[$1][$2][$3]\n";                                                       #
  13.  
  14.         push(@list,{                                           
  15.                                                                        
  16.             link        => $1,         
  17.             title       => $2,
  18.             description => $3,
  19.         });
  20.  
  21.     }
  22.  
  23.     return \@list;                                                             
  24.  
  25. }
  26.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He hecho lo que te dije de hacer un bucle y pasarle como variables de entrada el link y el nombre de la empresa ¿sería así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my($conexion,$sth,$nombre,$link);
  2.  
  3. $conexion = ConectarDB->connect();
  4.  
  5. $sth = $conexion->prepare("SELECT * FROM hoja1")or die("Couldn't prepare statement: " . $conexion->errstr);;                          
  6.        
  7. $sth->execute()or die("Couldn't execute statement: " . $sth->errstr);                                                                  
  8.  
  9.  
  10. while (my $ref = $sth->fetchrow_hashref()) {            
  11.            
  12.  
  13.         $nombre = $ref->{'link'};                                                        
  14.  
  15.         $link = $ref->{'nombre'};
  16.  
  17.         printf ("$ref->{'nombreEmpresa'}:  ");
  18.  
  19.         printf ("$ref->{'link'}\n");
  20.  
  21.  
  22.         my $rss = MyModulo->new($nombre,$link);
  23.  
  24.         my $hasNewItem = $rss->update;
  25.  
  26.  
  27.         if($hasNewItem){
  28.  
  29.                 print "RSS updated with some new items";
  30.                
  31.                 return 1;
  32.  
  33.         }else{
  34.  
  35.                 print $rss->updateStatus;
  36.                
  37.                 return undef;
  38.  
  39.         }
  40. }
  41.  
  42. $sth->finish();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


lo único que a la hora de recogerlas en el programa ¿las debería recoger en el init() o fuera de él?


Y por último para poder revisar todas las páginas con el mismo código ¿podría incluir los diferentes bucles en el código que puse arriba de makeitemList()?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-05 14:41 @653

jacks escribiste:Una pregunta ¿Por qué pones my $html = read_file('kk.html'); y en el otro código no lo pusiste ?
Es solo un programa de prueba. Lo que interesa es la expresión regular.

jacks escribiste:He hecho lo que te dije de hacer un bucle y pasarle como variables de entrada el link y el nombre de la empresa ¿sería así?
Yo creo que sí...

jacks escribiste:lo único que a la hora de recogerlas en el programa ¿las debería recoger en el init() o fuera de él?
Pues... no lo sé.

jacks escribiste:Y por último para poder revisar todas las páginas con el mismo código ¿podría incluir los diferentes bucles en el código que puse arriba de makeitemList()?
Es que eso te complica mucho el código. Quiero decir que se puede hacer, pero tendrás que poner todas las posibilidades en la misma subrutina.

Yo... crearía un paquete distinto por cada tipo de página. Y guardar en la base de datos el nombre del módulo a cargar. Así, habría que escribir más, pero el código queda más claro.
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-05 15:27 @685

¿Y cómo distinguiría el programa qué código usar para cada página?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-05 16:41 @737

A ver... la idea es que en el bucle que recorre la base de datos, creando un objeto según la página a analizar. Es decir, donde pone

my $rss = MyModulo->new($nombre,$link);

habría que cambiarlo por

my $rss = $modulo->new($nombre,$link);

siendo $modulo el nombre del módulo a cargar, que también estará almacenado en la base de datos.

Así, por cada página, tenemos un $rss distinto, con código distinto.
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-06 05:02 @251

¡Ah!, vale. He estado probando con el código para esta página y ¿quedaría así?

CÓDIGO NUEVO:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub makeItemList {
  2.  
  3.     my $self = shift;
  4.     my $html = shift;
  5.  
  6.     my @list;
  7.  
  8.      # $html = decode('iso-8859-15', $html);                                           
  9.  
  10.     while ($html =~ m{<h2>(.+?)</h2>.+?<p class="preamble">(.+?)</p>.+?<p>(.+?)</p>.+?<p>(.+?)</p>}smg){               
  11.  
  12.         # print "[$1][$2][$3]\n";                                                      
  13.  
  14.         push(@list,{
  15.             title       => $1,
  16.             description => $2.$3.$4,
  17.         });
  18.  
  19.     }
  20.  
  21.     return \@list;                                                                     
  22.  
  23. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


CÓDIGO ANTERIOR:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub makeItemList {
  2.  
  3.     my $self = shift;
  4.     my $html = shift;
  5.  
  6.     my @list;
  7.  
  8.      # $html = decode('iso-8859-15', $html);                                           
  9.  
  10.     while ($html =~ m|<h2 ><a href="(.*?)" title="(.*?)".+?<p>(.+?)>|smg){             
  11.  
  12.         # print "[$1][$2][$3]\n";                                                      
  13.  
  14.         push(@list,{
  15.             link        => $1,
  16.             title       => $2,
  17.             description => $3,
  18.         });
  19.  
  20.     }
  21.  
  22.     return \@list;                                                                     
  23.  
  24. }
  25.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero lo ejecuto y me sale lo siguiente ( copiado de .cache porque el .xml no sé por qué pero sigue sin generarlo bien porque no se lee):

(he recortado yo la descripción pero el título no me lo genera)


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. "$VAR1 = [
  2.          {
  3.            'title' => '<a href="/en/com/Site/Search/">Search</a>',
  4.            'description' => 'Security monitoring and access control without physical contact – made possible by RFID-enabled ASSA ABLOY products. '
  5.          }
  6.        ];
  7. "
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y me da los siguientes errores:
Adjuntos
pantallazo.JPG
pantallazo.JPG (77.76 KiB) Visto 829 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-07-06 05:35 @274

Pues no sé de dónde viene el error...

Lo que sí te falta es la parte del 'link' para meter en @list. Debes darle un valor siempre, aunque sea el mismo valor en todos los casos. Debes ponerlo entre la línea 14 y la 15.
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-06 15:40 @694

Hola, explorer. He estado probando yo con el resto de las páginas, y vale, en una de ellas
consigo sacar esto :

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <h4>BeCode evo</h4>
  2. <p>User-friendly handling through simple operation <a href="/index.php?option=com_content&amp;view=article&amp;id=2&amp;Itemid=7&amp;lang=en">more ...</a></p>
  3. <div class="image-box">
  4. <p><a href="/index.php?option=com_content&amp;view=article&amp;id=2&amp;Itemid=7&amp;lang=en"><img class="reflect rheight30 ropacity40" src="/images/stories/produkt-menu/becode-evo.jpg" border="0" width="202" height="218" style="border: 0pt none;" /></a></p>
  5. </div><span class="article_separator">&nbsp;</span>     </li>
  6.                 <li>
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

con este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<h4>(.+?)</h4>.+?<p>(.+?)</p>}smg){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



pero para sacar esto que lo que está entre <h2> "Tobe or not to be" es el título y <p> "all locking system..." es la descripción:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <h2 class="contentheading">
  2.         <img src="/templates/beloxx/images/h2-left_bg.png" alt="" title="" />
  3.         Products - To Be or not to Be    <img src="/templates/beloxx/images/h2-right_bg.png" alt="" title="" />
  4. </h2>
  5.  
  6.  
  7. <p class="buttonheading">
  8.         </p>
  9.  
  10.  
  11. <table border="0">
  12. <tbody style="text-align: left;">
  13. <tr style="text-align: left;">
  14. <td style="text-align: left;" align="left" valign="top">
  15. <div class="small">
  16. <p>All locking systems in the Beloxx product range have one thing in  common: They are different from standard locking systems because of the  easy installation, well thought-out operation and consistent design.  Furniture can be upgraded very attractively and locking can be  absolutely easy.</p>
  17. <p>Here, Beloxx builds on true innovations with the BeCode: Instead of  keys, complex wiring and difficult programming, the well-known BeCode  system is activated simply be turning and pressing. Up to 100.000  locking cycles with one battery, more than 1 million user-code  variations and 10 billion master-code variations&nbsp;are possible.</p>
  18. <p>The BeCode is compatible to almost all popular mechanical locking  systems so that retrofitting and use in electronic variations are very  easy. See for yourself!</p>
  19. </div>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


he utilizado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<h2 class="contentheading">(.+?)</h2>.+?<div class="samll"><p>(.+?)</p><\div>}smg){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero no consigo sacar nada. ¿Está mal hecho el patrón de búsqueda, no?

y por último, para conseguir sacar el link que hay en cada <a href :

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. </table>
  2.    
  3.     <div style="padding:0px; font-size:8px; "><br /></div>
  4.  
  5.     <span style="font-size:8pt;">Klicken Sie auf die Produktbilder für mehr Informationen über die entsprechende Produktkategorie:</span><br />
  6.     <input name="ctl00$ctl00$CenterBlockContents$WebFormContents$dummy" type="text" onchange="javascript&#058;setTimeout('__doPostBack(\'ctl00$ctl00$CenterBlockContents$WebFormContents$dummy\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="ctl00_ctl00_CenterBlockContents_WebFormContents_dummy" style="visibility:hidden; Z-INDEX: 101; POSITION: absolute; LEFT: 1px; TOP: 1px" />
  7.     <table id="Tabelle_01" width="731" height="904" border="0" cellpadding="0" cellspacing="0">
  8.         <tr>
  9.                 <td>
  10.         <a href="/KatalogCdr.aspx?page=3&key=1047">
  11.        
  12.                         <img border="0" src="UebersichtsSeiten_2008/Uebersicht_Seite_3/Bilder/1047.jpg" width="149" height="106" alt=""></a></td>
  13.                 <td colspan="5">
  14.  
  15.         <a href="/KatalogCdr.aspx?page=3&key=1048">
  16.        
  17.                         <img border="0" src="UebersichtsSeiten_2008/Uebersicht_Seite_3/Bilder/1048.jpg" width="149" height="106" alt=""></a></td>
  18.                 <td colspan="7">
  19.         <a href="/KatalogCdr.aspx?page=3&key=1062">
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



con esto no me lo saca bien porque me saca más cosas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($html =~ m{<a href="(.+?)">(.+?)</a>}smg){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-07-06 15:54 @704, editado 1 vez en total
Razón: Tildes
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 17 invitados