Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Estrazione stringhe da HTML

    Ciao a tutti!
    Devo estrarre dei dati da una pagina HTML che potete vedere qui: http://cnt.rm.ingv.it/~earthquake/in...ml_selection=0. Devo estrarre i dati di tutta la tabella per poi elaborarli in un secondo momento organizzando il tutto in db. Il problema ce l'ho con l'estrazione di tali dati.

    La cosa che inizialmente ho fatto è cercare di estrarre e rendere "visibili" con dei caratteri notevoli (tipo XXX o ***) le righe della tabella. L'HTML originale di ogni riga è il seguente:

    Codice PHP:
    <tr>
                    <
    td class="td_events">2206515190</td
                    <
    td class="td_events"></td
                    <
    td class="td_events">2009/04/07</td
                    <
    td class="td_events">08:00:52</td
                    <
    td class="td_events">42.383</td
                    <
    td class="td_events" width="45px">13.401</td
                    <
    td class="td_events">15.1</td
                    <
    td class="td_events">Ml:3.2</td
                    <
    td class="td_events"></td
                    <
    td class="td_events">Aquilano</td
                    <!--
                            
    COMMENTI VARI
                    
    --> 
                </
    tr
    Per tanto ho buttato giù questo codice php (scritto molto alla svelta):

    Codice PHP:
    <?php


    $page 
    file_get_contents('http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0');

    $format=ereg_replace("<td class=\"td_events\">""XXX"$page);
    $format=ereg_replace("<td class=\"td_events\" width=\"45px\">""XXX"$format);
    $format=ereg_replace("""AAA"$format);

    $page=ereg_replace("XXXAAA"" "$format);


    $posini=strpos($page,"XXX");
    $posfin=strpos($page,"<!--");
    $lensub=$posfin-$posini;

    $page1=substr($page$posini$lensub);

    echo
    "$page1";


    ?>
    Il file HTML di prima mi diventa con tale formattazione:

    Codice PHP:
                      <tr>
     
                    
    XXX1206517890</td>
                     </
    td>
                    
    XXX2009/04/07</td>
                    
    XXX12:29:00</td
                    
    XXX42.461</td>
                    
    XXX13.412</td>
                    
    XXX8.3</td>
                    
    XXXMl:3.3</td>
                     </
    td>
                    
    XXXGran_Sasso</td>
                        <!--
                            
    COMMENTI VARI
                    
    --> 
                </
    tr

    Comunque sia, una volta formattato, l'ultimo echo del codice mi visualizza qualcosa che non mi aspettavo.
    Infatti dal codice che ho inserito, mi aspettavo di trovare in output solo la prima riga della tabella, poichè ho fatto un substr con la posizione iniziale che sarebbe la posizione di XXX2206515190 della prima riga della tabella e lunghezza pari alla differenza tra la posizione della stringa di chiusura di una riga "<!--" (ogni riga si chiude con questo simbolo di commento) e la posizione iniziale trovata prima.

    Invece mi ritrovo in output tutte righe in tabella tranne (e questa è una cosa strana) l'ultima che la vedo troncata e quindi la vedo in modo parziale.

    Perchè ho questo output?
    Come faccio a risolvere questo problema?


    Per come la vedo io è un problema di fondo relativo alla mia incapacità e non un problema di difficoltà assoluta. C'è qualcosa che mi sfugge ma è da un pò che ci sbatto la testa ed è per questo che chiedo a voi.

    Grazie in anticipo a tutti coloro che mi scriveranno!

    Andriy

  2. #2

    io lavorerei con questo output che mi sembra più umano:

    Codice PHP:
    <?php

    $page 
    file_get_contents('http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0');

    strip_tags($page);
    $tmp explode('Sismico',$page);
    $page1 $tmp['1']; 

    echo 
    "$page1";

    ?>

  3. #3
    Grazie archimonde, il tuo script funziona benissimo. Potrei anche chiudere qui ma certamente non capirei molte cose. Non mi sono mai cimentato con le stringhe (penso che dall'umano' che hai attribuito prima al mio codice l'avrai capito) pertanto ti chiedo se non è troppo un piccola spiegazione. strip_tags ti è servito per togliere i tag html, ma nella funzione explode c'è una stinga 'Sismico' che non ho ben capito da dove l'hai presa. Infine una curiosità: non è possibile con questo script selezionare riga per riga?

    Ti ringrazio già tantissimo, sei stato molto gentile

    Andriy

  4. #4
    explode() crea un array partendo da una stringa usando 'Sismico' come divisore.
    L'ho preso dal sorgente html della pagina perchè è la stringa che precede i dati che a te servono.
    Riga per riga: utilizzo sempre explode() con '</tr>' che in una tabella delimita le righe.

    Codice PHP:
    <?php

    $page 
    file_get_contents('http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0');

    $tmp explode('Sismico',$page);

    $tmp2 explode('</tr>',$tmp['1']);

    $c_tmp2 count ($tmp2);

    for (
    $i=0$i<$c_tmp2$i++ )
    {
    $riga strip_tags($tmp2[$i]);
    echo 
    "$riga
    "
    ;
    }

    ?>
    Sicuramente ci sono altri metodi anche più ortodossi per fare quanto chiedi. Era per darti qualche spunto

  5. #5
    Intanto grazie, il codice funziona bene. Non mi ero proprio accorto del 'Sismico' come divisore (a dire la verità, l'ho cercato nella pagina html ma non l'ho trovato...mi sarà sfuggito).

    Adesso il problema è isolare (riga per riga) ogni singolo dato. Ho provato facendo un explode su ogni i-esima riga, con separatore lo " " spazio. Ma non mi visualizza niente. Eppure se estraggo una riga, essa è visualizzata correttamente con gli spazi come separatori tra un campo ed un altro. Dovrei usare qualche funzione?

    Ho provato sulla prima riga con questo codice (che però mi visualizza una pagina vuota):

    Codice PHP:
    <?php 

    $page 
    file_get_contents('http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0'); 

    $tmp explode('Sismico',$page); 

    $tmp2 explode('</tr>',$tmp['1']); 

    $array explode(" ",$tmp2[0]); 

    echo 
    "$array[0]";
    echo 
    "$array[1]";
    echo 
    "$array[2]";
    echo 
    "$array[3]";
    echo 
    "$array[4]";
    echo 
    "$array[5]";
    echo 
    "$array[6]";
    echo 
    "$array[7]";

    ?>

  6. #6
    I dati di ogni riga sono racchiusi dai tag <td></td>

    Codice PHP:

    <?php

    $page 
    file_get_contents('http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0');

    $tmp explode('Sismico',$page);

    $tmp2 explode('</tr>',$tmp['1']);

    $c_tmp2 count ($tmp2);

    for (
    $i=0$i<$c_tmp2$i++ )
    {
    $k='0';
    $tmp3 explode("</td>",$tmp2[$i]);

    foreach (
    $tmp3 as $dato)
    {
        echo 
    "$dato
    "
    ;
        
    $dati[$i][$k]=trim(strip_tags($dato));
        ++
    $k;
    }
    }

    echo 
    $dati['12']['6'];
    ?>
    lo script crea la matrice bidimensionale $dati[riga][colonna].
    Puoi commentare gli echo, sono giusto per mostrare l'output.

    Oppure potresti descrivere ogni riga con un'espressione regolare, giocando con

    RegexTest

    e usando ereg()
    http://php.html.it/articoli/leggi/85...ni-regolari/4/

  7. #7
    Studiati questo codice:

    Codice PHP:
    <pre>
    <?php 
    $results 
    = array();
    $url 'http://cnt.rm.ingv.it/~earthquake/index_web_cnt.php?year=2009&month=04&ml_selection=0';
    $content file_get_contents($url);
    $pattern '#<tr class="print_.*?</tr>#si';
    if (
    preg_match_all($pattern$content$rows)) {
        foreach (
    $rows[0] as $row) {
            
    $pattern '#<td[^>]*>(.*?)</td>#si';
            if (
    preg_match_all($pattern$row$matches)) {
                
    $results[] = $matches[1];
            }
        }
    }
    print_r($results);
    ?>
    </pre>

  8. #8
    come scrivevo qualche post su, ci sono sicuramente metodi più ortodossi, grazie filippo

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 © 2025 vBulletin Solutions, Inc. All rights reserved.