Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Php html parser,aiuto!

  1. #1

    Php html parser,aiuto!

    Ciao a tutti ragazzi,sto giocando con un parser html trovato sul web che fa egreggiamente il suo lavoro..ho però un problema..Praticamente questo parser scorre tutti gli span che hanno una classe di nome b ed io gli voglio far prendere solo il 2o elemento quindi ho messo un contatore i inizializzato a 0 e quando è uguale ad 1,cioè il secondo elemento del foreach,mi sputa fuori il valore trovato..ora facendo in questo modo però il foreach scorre tutto il codice,non si ferma al primo anche se effettivamente in utput ho solo il valore da me ricercato.Questo ovviamente rallena in maniera incredibile l'esecuzione dello script..non è possibile specificare quale elemento voglio prendere e non far arrivare il foreach a scorrere tutto il file htm?

    il codice è il seguente



    // Find all SPAN tags that have a class of "b"
    $stazione= file_get_html('www.prova.it/stazione.htm');

    echo 'Stazione';
    $i = 0;

    foreach($stazione->find('span.b') as $m){
    if($i == 1) {
    echo $m->outertext;
    }
    $i++;
    }

    Grazie mille ragazzi!

  2. #2
    Codice PHP:
    $spans $stazione->find('span.b');
    echo 
    $spans[1]->outertext

  3. #3
    Adesso solo con un dato mi va fuori memoria....sembra peggio di prima..Questo è l'errore

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16 bytes)

    E questo è il codice

    echo '<table><tr><td></td><td>Attuale</td><td>Max</td><td>Min</td><td>Pioggia</td></tr>';
    echo '<tr><td align="center">Stazione</td>';
    $spans=$stazione->find('span.b');
    echo '<td align="center">';
    echo $spans[1]->outertext;
    echo '</td>';

    echo '<td align="center" style="color:red;">';
    echo $spans[2]->outertext;
    echo '</td>';


    echo '<td align="center" style="color:blue;">';
    echo $spans[3]->outertext;
    echo '</td>';


    echo '<td align="center">';
    echo $spans[19]->outertext;
    echo '</td></tr>';

    ......

  4. #4
    Help

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    39
    Potresti aumentare la memoria disponibile:
    Codice PHP:
    ini_set('memory_limit','16M'); 
    ma ti consiglio di cambiare metodo per effettuare il parsing:

    Mettiamo che questa sia la pagina web:

    codice:
    <html>
      <body>
        
    
    testo</p>
        <span class="b"> ciao</span>
        <div>qualcosa</div>
        <span class="b"> ciao2</span>
        <span class="b"> ciao3</span>
      </body>
    </html>
    Te devi stampare " ciao2".

    Codice PHP:
    $uri 'http://www.esempio.it/'//pagina da parsare
    $get file_get_contents($uri); // si prende il contenuto e se lo salva come testo (stringa) dentro la variabile $get

    // per fare una prova potresti usare
    /*
    $get= '<html>
      <body>
        

    testo</p>
        <span class="b"> ciao</span>
        <div>qualcosa</div>
        <span class="b"> ciao2</span>
        <span class="b"> ciao3</span>
      </body>
    </html>';
    */

    // adesso puoi usare le funzioni per le stringhe, nel tuo caso è utile strpos() e substr()
    $pos1 strpos($get"span class=\"b\"");  // cerca nella stringa il testo "span class="b"" e ti restituisce la posizione (in caratteri dall'inizio) della "s" iniziale di "span...".

    $pos2 strpos($get"</"$pos1); // dalla posizione 1 (il numero appena trovato) cerca "</" e ti restituisce la posizione (sempre in caratteri)

    $c substr($get$pos1+15$pos2-$pos1-15); // salva in $c ula stringa dei caratteri compresi fra la posizione 1 aumentata di 15 (perchè non devi stampare '<span class...' ma solo ' ciao2' e la posizione 2 diminuita di 15 
    se adesso stampi $c il risultato è 'ciao' cioè il contenuto del primo span.
    per avere il secondo span devi semplicemente iterare il tutto.
    Codice PHP:
    $uri 'http://www.esempio.it/'//pagina da parsare
    $get file_get_contents($uri); // si prende il contenuto e se lo salva come testo (stringa) dentro la variabile $get
    $pos0 0// posizione da cui parte il parsing (prima dell'iterazione da 0, poi durante l'iterazione partirà dall'ultimo span trovato
    $i=0;

    while (
    $i<=1){ //quante volte deve iterare (per l'ennesimo span aumenta il valore)
    $pos1 strpos($get"span class=\"b\""$pos0);  // cerca partendo da pos0
    $pos2 strpos($get"</"$pos1); // dalla posizione 1 (il numero appena trovato) cerca "</" e ti restituisce la posizione (sempre in caratteri)

    $c substr($get$pos1+15$pos2-$pos1-15);
    if(
    $i==1){echo $c;} // se è la seconda iterazione stampa $c

    $pos0 $pos2+5;
    $i++;

    Come per magia stamperà "ciao2". Il tempo è solo quello del caricamento dell'url esterno, lo script in sè è velocissimo.
    Buona fortuna!

  6. #6
    Ottimo grazie millle!Purtroppo quello che ho notato è che il tempo che ci mette a caricare èdovuto allo scaricamento della pagina ed al salvataggio nella variabilr $get..La pagina la deve cmq scaricare per forza tutta?non posso farne scaricare solo una parte che dico io?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    39
    Originariamente inviato da darko1984
    Ottimo grazie millle!Purtroppo quello che ho notato è che il tempo che ci mette a caricare èdovuto allo scaricamento della pagina ed al salvataggio nella variabilr $get..La pagina la deve cmq scaricare per forza tutta?non posso farne scaricare solo una parte che dico io?
    Purtroppo per sapere quale parte prendere deve prima leggerla e quindi scaricarla...
    Con il codice che ho messo io lo fa una volta sola e poi lavora sul quel codice. Stiamo parlando di 2-3 secondi in più, se il sito remoto ha una velocità di caricamento normale penso che sia tollerabile.

    I modi per eludere il problema possono essere fantasiosi e dipendono da cosa ti serve: potresti caricare i dati in maniera asincrona con javascript-ajax (il tempo è sempre lo stesso ma invece di vedere pagina bianca si vede per 1-2 secondi una rotellina che gira...) oppure scaricare i dati con uno script che li salva su database e poi l'utente finale vede i dati salvati nel database (aggiornati magari giornalmente).

    Ovviamente il modo più veloce sarebbe quello di utilizzare un webservice (devi avere i dati in rss/xml) se il sito remoto lo offre (scrivevi di stazioni: magari i dati degli orari dei treni sono offerti in formato xml...)

  8. #8
    Il problema principale è che sullo stesso script in php devo far comparire i dati presi da decine di pagine html diverse per questo chiedevo se si poteva fare qualcosa per non scaricare tutto il codice ma giustamnte se prima non lo legge non può far niente..

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    39
    Originariamente inviato da darko1984
    Il problema principale è che sullo stesso script in php devo far comparire i dati presi da decine di pagine html diverse per questo chiedevo se si poteva fare qualcosa per non scaricare tutto il codice ma giustamnte se prima non lo legge non può far niente..
    Immaginavo, è il caso più ostico. In tal caso potresti creare 2 script: uno scarica i dati e li salva sul database e uno li mostra (per l'utente finale).
    Quello che scarica i dati sarà da far girare ogni tot di tempo per aggiornarli (oppure una volta sola, dipende che dati sono). Ma soprattutto dovrà avere avere i limiti di memoria e timeout alzati oppure deve essere studiato in maniera apposita cioè lo script conosce i propri limiti e agisce di conseguenza (per esempio fa 5 url alla volta e poi ricarica la pagina e continua).

    Ovviamente bisogna conoscere il php abbastanza bene...

  10. #10
    Ottima idea,potrei creare uno script bash su un srver linux chee ho sempre acceso e mandare l'html sul sito!

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.