Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    estrapolare dati da table html

    Salve,

    vorrei sapere se con una RE si può estrapolare dei dati da delle righe di codice html. In questo caso riporto come possono presentarsi le righe nella pagina..su un rigo solo oppure in

    un blocco:
    codice:
    <html>
    <body>
    <center>
    
    <table>
    
    <tr>
    <td>
    <pre>perl1984<font color="#00AA00">0,00</font>00:00:00 1,0000 1.0 2,0000 2.0 9.9 
    </td>
    </tr>
    
    
    <tr><td><pre>php2000 <font>wow2000</font> 17:39:59 13.500,0000             0.0 13.445,0000      0.0 16.236 </td></tr>
    ...etc...
    </table>
    
    </center>
    </body>
    </html>
    prendendo in esama queste riga di TR(html) mi piacerebbe estrapolare:

    la parola perl, il valore 1984 (text) tra il tag B(html), il valore 0,00 tra il tag FONT(html)gli altri valori che sono separati da spazio (uno o più spazi...o magari sono tabs è uguale)

    credete che sia possibile o devo rivolgermi a qualche modulo cpan?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so se ci sono moduli cpan migliori, ma so che con le RE si puo` risolvere.

    Se l'ordine dei due campi interessanti e` sempre lo stesso, puoi usare una cosa del genere:
    codice:
    /\<tr.+?\<a.+?\>(.+?)\<\/a.+?b\>(.+?)\<\/b.+?font\>(.+?)\<\/f.+?\<\/tr\>/im
    Nota l'uso dei ? (per fermarsi alla prima occorrenza del carattere successivo);
    e nota alla fine le opzioni:
    /i serve per ignorare maiuscole/minuscole
    /m serve per ignorare gli acapo (pero` in qualche altro caso serve invece il /s - ora non ricordo piu` esattamente)
    non ricordo se i simboli < e > devono essere preceduti da backslash. Sicuramente la slash deve essere preceduta
    Nel man perlre tutte queste cose sono spiegate.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Ok, intanto ti ringrazio e mi metto a studiare un pò le re...cmq ecco il file modello da cui dovrei estrapolare i valori dalle righe html: http://theartofweb.net/quotes/table.htm

    in pratica per ogni riga vorrei creare un hash strutturato così:

    codice:
    $quote{riga1}{Titolo} = ""
    $quote{riga1}{Prezzo} = ""
    $quote{riga1}{Var} = ""
    $quote{riga1}{Ora} = ""
    $quote{riga1}{Denaro} = ""
    $quote{riga1}{QtaDenaro} = ""
    $quote{riga1}{Lettera} = ""
    $quote{riga1}{QtaLettera} = ""
    $quote{riga1}{ncontr} = ""
    
    ...etc...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    A proposito di studio ...
    Adesso c'e` anche il
    man perlretut
    che dovrebbe essere un tutorial per imparare le RE in perl.
    Quando studiavo io le RE tale tutorial non c'era, ed ho dovuto beccarmi le info dal man perlre, dove c'e` tutto, ma richiede una buona dose di conoscenza per sapersi muovere all'interno del man.

    Comunque ora ho capito meglio cosa vuoi. La RE che ho impostato prima, spezza solo le prime parti, quelle separate dai tag, mentre tu devi inserire altri campi separati da \s (carattere spaziatore - blank o tab).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    perchè il seguente codice mi riporta solo "tuccio" e non anche gli altri valori?

    codice:
    #!/usr/bin/perl -w
    
    use strict;
    use warnings;
    
    my @html; { local $/; @html = (<DATA>) };
    
    foreach (@html)
    {
        chomp;
        /<tr[^>]*><td[^>]*>(.*?)<\/td><\/tr>/i;
        
        print "$1\n";
    }
    
    __DATA__
    <html>
    <body>
    
    <table border="1">
    <tr><td>tuccio</td></tr>
    <tr><td>marameo</td></tr>
    <tr><td>baubau</td></tr>
    </table>
    
    </body>
    </html>

  6. #6
    ok diciamo che ho risolto così...tutttavia nonriesco a trovare un modo per estrapolare i numeri finali divisa da uno o più spazi:

    codice:
    #!/usr/bin/perl -w
    
    use strict;
    use warnings;
    
    my @html = <DATA>;
    
    foreach (@html)
    {
        if ( m/<tr[^>]*><td[^>]*>(.*?)<\/td><\/tr>/i )
        {
            if ( m/<a[^>]*>(.*?)<\/a>/) { print $1 }
            if ( m/<b[^>]*>(.*?)<\/b>/) { print $1 }
            if ( m/<font[^>]*>(.*?)<\/font>/) { print $1 }
        }
    }
    
    
    
    __DATA__
    <html>
    <body>
    
    <table border="1">
    <tr bgcolor="#fff"><td>tuccio</td></tr>
    <tr><td>marameo</td></tr>
    <tr><td><pre>mibtel    11.047,0000  <font color="#AA0000">  -1,15</font>   10:01:57 13.350,0000        8 13.360,0000        9    0.0 </td></tr>
    </table>
    
    </body>
    </html>

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non capisco quel doppio passaggio (coni vari if).
    Puoi estrarre tutto in un unico passaggio come nella mia RE, che pero` va modificata:
    codice:
    ~/<tr.+?<a.+?>(.+?)<\/a.+?b>(.+?)<\/b.+?font>(.+?)<\/font>\s*((.+?)\s+)+(.+?)\s*<\/td>/i
    print $1 $2 $3 ...;
    Nota gli spazi opzionali prima e dopo la stringa fuori dal <font>

    Io preferisco usare .+ anziche` .*, in modo che non riporti stringhe vuote (possibili con il .* se ci sono spazi multipli)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  8. #8
    purtroppo non riesco a far funzionare il tuo codice...non estrapola i dati...a questo puntomi piacerebbe sapere come estrarre i numeri dopo il tag font perpoi normalizzarli

  9. #9
    per estrarre tutto l'ultima parte di numeri basta fare:

    codice:
    if ( m/<\/font>(.*?)<\/td>/i )      { print $1 }
    Per normalizzare intendo trasformare una stringa da:

    $_ = " 0 2 1 3 5 44 69 4";

    a

    $_ = "0 2 1 3 5 44 69 4" così poi poso fare una split()

    grazie

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ma estrae qualcosa o si ferma all'inizio?
    Perche` le RE sono potentisisme, ma anche piuttosto delicate: se le guardi storto si ribellano.

    Comunque prova con una versione "ridotta":
    codice:
    ~/<tr.+?<a.+?>(.+?)<\/a.+?b>(.+?)<\/b.+?font.+?>(.+?)<\/font>(.+?)<\/td>/i
    print $1;   # dovrebbe contenere mibtel
    print $2;   # dovrebbe contenere 11.047,0000
    print $3;   # dovrebbe contenere  -1,15
    print $4;   # dovrebbe contenere tutto il resto
    (l'esempio e` tratto dalla riga: <tr><td><pre>mibtel 11.047,0000 <font color="#AA0000"> -1,15</font> 10:01:57 13.350,0000 8 13.360,0000 9 0.0 </td></tr>)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.