• Publicidad

Guardar según un vector de búsqueda

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

Guardar según un vector de búsqueda

Notapor later » 2010-01-30 13:33 @606

Hola, buenas. Mi intención es crear un script que me permita guardar en un txt unos datos en concreto que tengo en una página web.

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
width="62">GUARDAR_1</td>
target="_blank" class="style14">GUARDAR_2</a>
download/GUARDAR_3"
author/AQUI_PUEDE_PONER_CUALQUIER_COSA">GUARDAR_4</a>

...

width="62">GUARDAR_1</td>
target="_blank" class="style14">GUARDAR_2</a>
download/GUARDAR_3"
author/AQUI_PUEDE_PONER_CUALQUIER_COSA">GUARDAR_4</a>

...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Así sucesivamente.

Quiero guardar los GUARDAR_* en sus correspondientes arrays @guardar1, @guardar2, @guardar3, @guardar4.

Y lo que he puesto delante y después de cada GUARDAR_* son los string para localizar su ubicación.

En la última línea donde dice "AQUI_PUEDE_PONER_CUALQUIER_COSA" la cual forma parte
del string de búsqueda del GUARDAR_4, puede cambiar, entonces supongo que tendremos que hacer uso de alguna expresión que no dé importancia a lo que haya en ese lugar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use IO::Socket::INET;
  4. use LWP::UserAgent;
  5. use HTTP::Request;
  6. use LWP::Simple;
  7.  
  8. $host = "URL DE LA WEB";
  9.  
  10. my $final = $host;
  11. print $final,"\n\n";
  12. my $ua = LWP::UserAgent->new;
  13. my $req = HTTP::Request->new(GET => $final);
  14. $doc = $ua->request($req)->as_string;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y después de esto debería ir la búsqueda y el guardo.

He probado varias cosas pero no consigo.

Un saludo, y gracias anticipadas.
later
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2007-10-06 12:42 @570

Publicidad

Re: Guardar según un vector de búsqueda

Notapor explorer » 2010-01-30 18:09 @797

Lo siento, pero yo ahí no veo ningún código HTML al qué poder agarrarme...

¿No puedes poner una página HTML entera, resumida?

Es para ver el formato que tiene, en conjunto, para ver si se le puede atacar por algún sitio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Guardar según un vector de búsqueda

Notapor later » 2010-01-31 10:36 @483

Hola explorer. Claro que puedo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
<tr class="submit">

<td class="style14" nowrap="nowrap" width="62">GUARDAR_1</td>
<td nowrap="nowrap" width="375"><a href="lalala" target="_blank" class="style14">GUARDAR_2</a></td>
<td nowrap="nowrap" width=40 align="left">GUARDAR_3</td>
(...)
<td nowrap="nowrap" width="9" valign="middle" align="center">
        <a href="/lalala/download/GUARDAR_4" class="style16" title="download">D</a>
</td>
(...)
<td nowrap="nowrap" width="135">

        <a href="/author/ESTO_PUEDE_VARIAR">GUARDAR_5</a>
</td>
</tr>
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto sería resumido. Hay que tener en cuenta que abajo de éste hay otro código igual, hasta unos 30 más o menos, por lo que los datos deberán ir guardándose en un array si no me equivoco.

Por cierto, en el POST principal del tema se me olvidó una variable 'GUARDAR'.

Un saludo y gracias por la ayuda.
later
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2007-10-06 12:42 @570

Re: Guardar según un vector de búsqueda

Notapor erv-Z » 2010-01-31 10:45 @490

Lo que estás haciendo se hace con dos módulos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::UserAgent;
use HTTP::Request;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Guardar según un vector de búsqueda

Notapor explorer » 2010-01-31 11:10 @507

Se puede hacer muy fácil con los módulos LWP::Simple y HTML::TableExtract, pero para eso necesitamos saber la estructura de las tablas que hay dentro de la página. Si solo muestras el interior de una de ellas, no sabemos si es la primera o la única tabla de la página. Ni si está incluida dentro de otra, etc.

Todavía no veo por dónde coger el asunto. Yo al menos necesitaría ver la estructura de la página. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<body>
<table>
...
<table>
...
<table>
...
</table>
...
<table>
    <table>
        <table>
            <tr class="submit">      # repetido N veces
                <td class="style14" nowrap="nowrap" width="62">GUARDAR_1</td>
                <td nowrap="nowrap" width="375"><a href="lalala" target="_blank" class="style14">GUARDAR_2</a></td>
                <td nowrap="nowrap" width=40 align="left">GUARDAR_3</td>
                ( 3 <td> más )
                <td nowrap="nowrap" width="9" valign="middle" align="center"><a href="/lalala/download/GUARDAR_4" class="style16" title="download">D</a></td>
                ( 2 <td> más )
            </tr>
        </table>
    </table>
</table>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Con esto, es muy fácil saber la posición de las celdas que te interesan.

Otra forma... si la tabla tiene una línea con cabeceras o títulos, también es fácil sacar la información, también con el mismo módulo HTML::TableExtract.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Guardar según un vector de búsqueda

Notapor later » 2010-01-31 13:31 @605

Gracias explorer, miraré documentación del módulo que me has dicho, a ver si soy capaz de hacer algo solo.

Por cierto, lo que me has pedido.

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <table width="668" border="0" cellpadding="3" cellspacing="3" class="main">
  2.  
  3.   <tr><td><img src="" alt=""></td></tr><tr><td>
  4. <b>[ <a href="/" target=_self>lalala</a> ]</b><table borderColor="#333333" width="597" align="center" border="0">
  5.         <tr class="style13">
  6.         <td class="style13">-::DATE</td>
  7.         <td class="style13">-::DESCRIPTION</td>
  8.  
  9.         <td class="style13" width="40">-::HITS</td>
  10.         <td class="style13" width="9"></td>
  11.         <td class="style13" width="9"></td>
  12.         <td class="style13" width="9"></td>
  13.         <td class="style13" width="9"></td>
  14.         <td>-::AUTHOR</td>
  15.         </tr>
  16.  
  17.  
  18. <!-- CAMPO 1 -->
  19.  
  20. <tr class="submit">
  21. <td class="style14" nowrap="nowrap" width="62">GUARDAR_1</td>
  22. <td nowrap="nowrap" width="375"><a href="ESTO_VARIA" target="_blank" class="style14">GUARDAR_2</a></td>
  23. <td nowrap="nowrap" width=40 align="left">GUARDAR_3</td>
  24. <td nowrap="nowrap" width="9" valign="middle" align="center"><a href="ESTO_VARIA" class="style16" title="related releases">R</a></td><td nowrap="nowrap" width="9" valign="middle" align="center"></td>
  25. <td nowrap="nowrap" width="9" valign="middle" align="center">
  26.         <a href="/lala/download/GUARDAR_4" class="style16" title="download">D</a>
  27. </td>
  28. <td nowrap="nowrap" width="9" valign="middle" align="center"><a href="ESTO_VARIA" class="style16" title="browser test" target="_blank">X</a>
  29. </td>
  30. <td nowrap="nowrap" width="135">
  31.  
  32.         <a href="/author/ESTO_VARIA">GUARDAR_5</a>
  33. </td>
  34. </tr>
  35.  
  36. <!-- CAMPO 2 -->
  37.  
  38. <tr class="submit">
  39. <td class="style14" nowrap="nowrap" width="62">GUARDAR_1</td>
  40. <td nowrap="nowrap" width="375"><a href="ESTO_VARIA" target="_blank" class="style14">GUARDAR_2</a></td>
  41. <td nowrap="nowrap" width=40 align="left">GUARDAR_3</td>
  42. <td nowrap="nowrap" width="9" valign="middle" align="center"><a href="ESTO_VARIA" class="style16" title="related releases">R</a></td><td nowrap="nowrap" width="9" valign="middle" align="center"></td>
  43. <td nowrap="nowrap" width="9" valign="middle" align="center">
  44.         <a href="/lala/download/GUARDAR_4" class="style16" title="download">D</a>
  45. </td>
  46. <td nowrap="nowrap" width="9" valign="middle" align="center"><a href="ESTO_VARIA" class="style16" title="browser test" target="_blank">X</a>
  47. </td>
  48. <td nowrap="nowrap" width="135">
  49.  
  50.         <a href="/author/ESTO_VARIA">GUARDAR_5</a>
  51. </td>
  52. </tr>
  53.  
  54. <!-- FINAL -->
  55.  
  56. </table>
  57.  
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
later
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2007-10-06 12:42 @570

Re: Guardar según un vector de búsqueda

Notapor explorer » 2010-02-08 18:56 @831

HTML::TableExtract no vale para este caso, porque quieres guardar uno de los atributos que hay en una marca, no solo el contenido de las celdas. Habría que utilizar HTML::Parser... o expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $html = do { undef $/; open F, '<code_20884.html'; <F> };
  7.  
  8. my @vector;
  9.  
  10. while ( $html =~
  11.     /<td [ ] class="style14" [ ] nowrap="nowrap" [ ] width="62"> (.*?) <
  12.     |<td [ ] nowrap="nowrap" [ ] width="375"><a [ ] href=".*?" [ ] target="_blank" [ ] class="style14"> (.*?) <
  13.     |<td [ ] nowrap="nowrap" [ ] width=40 [ ] align="left"> (.*?) <
  14.     |<a [ ] href=" (.*?) " [ ] class="style16" [ ] title="download">
  15.     |<a [ ] href="\/author .*? "> (.*?) <
  16.     /gx
  17. ) {
  18.     if ($1) {
  19.         @vector = ($1);
  20.         next;
  21.     }
  22.     if ($2) {
  23.         $vector[1] = $2;
  24.         next;
  25.     }
  26.     if ($3) {
  27.         $vector[2] = $3;
  28.         next;
  29.     }
  30.     if ($4) {
  31.         $vector[3] = $4;
  32.         next;
  33.     }
  34.     if ($5) {
  35.         $vector[4] = $5;
  36.         print join(q[-], @vector), "\n";
  37.         next;
  38.     }
  39. }
  40. __END__
  41. GUARDAR_1-GUARDAR_2-GUARDAR_3-/lala/download/GUARDAR_4-GUARDAR_5
  42. GUARDAR_1-GUARDAR_2-GUARDAR_3-/lala/download/GUARDAR_4-GUARDAR_5
  43.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Seguro que se puede hacer de forma más abreviada.

¿Alguien se anima?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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 0 invitados