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

    Questione di array.. I risultato del foreach non è quello che speravo di ottenere..

    In breve ho scritto un piccolo parser dom per html che mi va a parsare alcune pagine amazon che mi interessano..
    Il problema è che alla fine vorrei ottenere ( come si può vedere dall'echo in basso al codice sotto ) un risultato unitario per ogni prodotto.. Con titolo, link, imm ecc.. Invece attualmente appaiono così..

    linklinklinklinklinktitolotitolotitolotitolo...ecc .

    Posto il codice per com' è ora, già funzionante, effettua il parsing, come si può vedere scorrendo la pag dei risultati che ne deriva.. Qualcuno sa dirmi in cosa sbaglio? Sto uscendo pazzo!

    Codice PHP:
    <?php 

    $html 
    file_get_contents('http://www.amazon.it/s/ref=sr_il_to_luggage?rh=n%3A2454148031%2Cp_8%3A45-100&sort=relevancerank&ie=UTF8&qid=1430756991&lo=none');
    $dom = new DOMDocument();
    @
    $dom->loadHTML($html);

    $xpath = new DOMXpath($dom);

    $prodotti = array();

            
    // Link Prodotto
            
    $links $xpath->query('//a[@class="a-link-normal a-text-normal"]');
            
            foreach (
    $links as $link) {
                    
    $linkprod $link->getAttribute('href');
                    
    $prodotti[] = array( "linkprod" => $linkprod );
            }
            
            
    // Link immagine 
            
    $images $xpath->query('//img[@alt="Dettagli prodotto"]');
            
            foreach (
    $images as $image) {
                    
    $linkimm $image->getAttribute('src');
                    
    $prodotti[] = array( "images" => $linkimm );
            }
            
            
    // Nome prodotto 
            
    $titles $xpath->query('//h2[@class="a-size-base a-color-null s-inline s-access-title a-text-normal"]');
            
            foreach (
    $titles as $title) {
                    
    $titleprod $title->nodeValue;
                    
    $prodotti[] = array( "titolo" => $titleprod );
            }
            
            
    //Prezzo prima 
            
    $prezzops $xpath->query('//span[@class="a-size-small a-color-secondary a-text-strike"]');
            
            foreach (
    $prezzops as $prezzop) {
                    
    preg_match_all('/((\d{1,5}),(\d{2}))/'$prezzop->nodeValue $res );
                    
    $prezzoprima $res[1][0];
                    
    $prodotti[] = array( "prezzop" => $prezzoprima );
            }
            
            
    //Prezzo dopo 
            
    $prezzods $xpath->query('//span[@class="a-size-base a-color-price s-price a-text-bold"]');
            
            foreach (
    $prezzods as $prezzod) {
                    
    preg_match_all('/((\d{1,5}),(\d{2}))/'$prezzod->nodeValue $res1 );
                    
    $prezzodopo $res1[1][0];
                    
    $prodotti[] = array( "prezzodopo" => $prezzodopo );
            
            }


    foreach (
    $prodotti as $prodotto):
                       echo 
    '<a href="'.$prodotto["linkprod"].'">'.$prodotto["titolo"].'</a><br>
                    <img src="'
    .$prodotto["images"].'" alt="test" height="150" width="150"><br>
                    Prima costava: '
    .$prodotto["prezzop"].' , ora viene: '.$prodotto["prezzodopo"].'';
    endforeach;

    ?>
    Basta incollare il codice salvarlo e caricarlo da qualche parte e funziona..
    Unica cosa che ho notato è che all'interno di $linkprod come delle altre variabili simili, se le metto in un var_dump mi da solo il primo titolo, se faccio un echo mi da tutti i risultati appiccicati.. mha..
    Grazie anticipatamente..

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,508
    Certo che ti esce così.
    Invece dell'ultimo foreach, quello che ti stampa i dati, metti
    echo "<pre>";
    print_r($prodotti);
    echo "</pre>";

    vedrai che ti accorgi del problema.

    EDIT: ho provato il tuo codice, non funziona, su tutti gli indici dell'array $prodotti dice che non sono definiti, proprio perché generi male tale array.
    Ultima modifica di Alhazred; 06-05-2015 a 10:19

  3. #3
    Per dare degli indici numerici automatici, avrei dovuto forse scrivere così?
    Codice PHP:
    $prodotti[] = array( $linkprod ); 
    O forse devo prima separare i risultati di $linkprod e degli altri componenti dell'array con una virgola spazio?
    Sono 2 giorni che sono fermo qui ..

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,508
    Devi fare in modo che l'array $prodotti sia fatto così (supponendo 10 articoli recuperati)
    Codice PHP:
    array(
        [
    0] => array('link' => 'il_link_0'
                     
    'images' => 'immagine_0',
                     
    'titolo' => 'il_titolo_0',
                     
    'prezzop' => 'prezzo_prima_0',
                     
    'prezzodopo' => 'prezzo_dopo_0'),

        [
    1] => array('link' => 'il_link_1',
                     
    'images' => 'immagine_1',
                     
    'titolo' => 'il_titolo_1',
                     
    'prezzop' => 'prezzo_prima_1',
                     
    'prezzodopo' => 'prezzo_dopo_1'),

        [
    2] => array('link' => 'il_link_2',
                     
    'images' => 'immagine_2',
                     
    'titolo' => 'il_titolo_2',
                     
    'prezzop' => 'prezzo_prima_2',
                     
    'prezzodopo' => 'prezzo_dopo_2'),

        .... 
    ecc ...

        [
    9] => array('link' => 'il_link_9',
                     
    'images' => 'immagine_9',
                     
    'titolo' => 'il_titolo_9',
                     
    'prezzop' => 'prezzo_prima_9',
                     
    'prezzodopo' => 'prezzo_dopo_9'),

    Adesso lo crei invece così (sempre supponendo 10 articoli recuperati)
    Codice PHP:
    array(
        [
    0] => array('link' => 'il_link_0'),
        [
    1] => array('link' => 'il_link_1'),
        [
    2] => array('link' => 'il_link_2'),
        .... 
    tutti gli altri link ....

        [
    10] => array('images' => 'immagine_0'),
        [
    11] => array('images' => 'immagine_1'),
        [
    12] => array('images' => 'immagine_2'),
        ... 
    tutte le altre immagini ...

        [
    20] => array('titolo' => 'titolo_0'),
        [
    21] => array('titolo' => 'titolo_1'),
        [
    22] => array('titolo' => 'titolo_2'),
        ... 
    tutti gli altri titoli ...

        [
    30] => array('prezzop' => 'prezzop_0'),
        [
    31] => array('prezzop' => 'prezzop_1'),
        [
    32] => array('prezzop' => 'prezzop_2'),
        ... 
    tutti gli altri prezzi iniziali ...

        [
    40] => array('prezzodopo' => 'prezzodopo_0'),
        [
    41] => array('prezzodopo' => 'prezzodopo_1'),
        [
    42] => array('prezzodopo' => 'prezzodopo_2'),
        ... 
    tutti gli altri prezzi finali ...

    Quindi quando vai a fare il foreach su $prezzi, ogni entry ha solo una chiave, per esempio non puoi cercare sulla entry [0] la chiave "titolo" perché non c'è (sta dalla entry 20 alla 29 in questo caso).
    Allo stesso modo se stampi semplicemente il contenuto dell'array, hai ovviamente prima tutti i link, poi tutte le immagini, poi i titoli ed i prezzi.
    Ultima modifica di Alhazred; 06-05-2015 a 12:03

  5. #5
    Esattamente.. è proprio questo che non riesco a fare...

    era questo che intendevo con
    linklinklinklinklinktitolotitolotitolotitolo...ecc .
    che al momento ho prodotto una array che genera prima tutti i link.. poi tutte le imm.. ora dovrei creare un'array esattamente come hai scritto tu sopra.. ma non ci riesco..
    Dovrei creare una sorta di array bidimensionale..
    Ultima modifica di otto9due; 06-05-2015 a 12:34

  6. #6
    Invece di fare 5 xpath query separate per i singoli "pezzi" che ti servono, fai una ricerca sui nodi che contengono i prodotti, poi fai un ciclo su quei nodi e per ognuno di essi estrai le varie informazioni, in modo da avere link, immagine, prezzo etc tutti dello stesso prodotto.

    Considera comunque che un parsing del genere si rompe facilmente, basta che amazon cambi una classe in uno span e non funziona piu'. Vedi se amazon fornisce delle API per fare ricerche come queste.

  7. #7
    Quote Originariamente inviata da k.b Visualizza il messaggio
    Invece di fare 5 xpath query separate per i singoli "pezzi" che ti servono, fai una ricerca sui nodi che contengono i prodotti, poi fai un ciclo su quei nodi e per ognuno di essi estrai le varie informazioni, in modo da avere link, immagine, prezzo etc tutti dello stesso prodotto.

    Considera comunque che un parsing del genere si rompe facilmente, basta che amazon cambi una classe in uno span e non funziona piu'. Vedi se amazon fornisce delle API per fare ricerche come queste.
    Hai perfettamente ragione, sono stato sul loro sito web, ma non ci ho capito moltissimo..
    IN più mi è parso di capire che c'è da pagare un abbonamento.. ( che vorrei evitare di pagare )

    Tornando a quanto hai suggerito, stavo cercando anche io un div o qualcosa che contenga i prodotti.. per ciclare quello.. ma poi sarebbe un casotto andare a trovare i tag figli di questo..

  8. #8
    Questo dovrebbe fare al caso mio.. ma non so come procedere..
    <div class="s-item-container"
    di questo div devo ciclarne il contenuto? E poi una volta trovato il contenuto tramite preg_match vado a tagliarmi tutti i vari pezzetti?

  9. #9
    Se i nodi sono quelli (sinceramente non ho controllato, parsare l'HTML e' una delle cose piu' noiose del web programming) allora si, con qualche regexp o un DOM parser estrai le informazioni che contengono.

  10. #10

    Risolto in parte..

    Alla fine ho "quasi" risolto così, prendendo in considerazione entrambi i consigli , riesco a generare un arrai secondo quello schema @grazie Alhazred, ciclando un div che contiene il prodotto @grazie k.b

    Ma mi da un errore quando faccio l'ultimo foreach per visualizzare i contenuti..
    Ecco il nuovo codice..

    Codice PHP:
    <?PHP$html file_get_contents('http://www.amazon.it/s/ref=sr_il_to_luggage?rh=n%3A2454148031%2Cp_8%3A45-100&sort=relevancerank&ie=UTF8&qid=1430756991&lo=none');$dom = new DOMDocument();@$dom->loadHTML($html);
    $xpath = new DOMXpath($dom);

      
    $divs $xpath->query('//div[@class="s-item-container"]');

      
    $dati_prodotto = array();  
      foreach(
    $divs as $div) {
            
    $links $xpath->query('.//a[@class="a-link-normal a-text-normal"]'$div);                foreach ($links as $link) {                $linkprod $link->getAttribute('href');        }        
            
    $images $xpath->query('.//img[@alt="Dettagli prodotto"]'$div);                foreach ($images as $image) {                $linkimm $image->getAttribute('src');        }        
            
    $titles $xpath->query('.//h2[@class="a-size-base a-color-null s-inline s-access-title a-text-normal"]'$div);                foreach ($titles as $title) {                $titleprod $title->nodeValue;        }        
            
    $prezzops $xpath->query('.//span[@class="a-size-small a-color-secondary a-text-strike"]'$div);                foreach ($prezzops as $prezzop) {                preg_match_all('/((\d{1,5}),(\d{2}))/'$prezzop->nodeValue $res );                $prezzoprima $res[1][0];        }        
            
    $prezzods $xpath->query('.//span[@class="a-size-base a-color-price s-price a-text-bold"]'$div);                foreach ($prezzods as $prezzod) {                preg_match_all('/((\d{1,5}),(\d{2}))/'$prezzod->nodeValue $res1 );                $prezzodopo $res1[1][0];                }      $dati_prodotto[] = array('linkprod' => $linkprod'imm' => $linkimm'titolo' => $titles'prezzop' => $prezzoprima'prezzodopo' => $prezzodopo );

      }     
    print_r($dati_prodotto);
              foreach (
    $dati_prodotto as $singolo_prodotto) :         echo '<a href="'.$singolo_prodotto["linkprod"].'">'.$singolo_prodotto["titolo"].'</a><br>        <img src="'.$singolo_prodotto["imm"].'" alt="test" height="150" width="150"><br>        Prima costava: '.$singolo_prodotto["prezzop"].' , ora viene: '.$singolo_prodotto["prezzodopo"].'<br /><br />';        endforeach;?>
    Come potete notare, in fondo alla pagina dei risultati che mostrano il contenuto del print_r, dovrebbe esserci il foreach che mi da questo errore:

    codice HTML:
    Catchable fatal error: Object of class DOMNodeList could not be converted to string in /web/htdocs/www.miosito.it/home/parsing.php on line 66
    P.S. Perchè quando posto codice alcune volte si vede così una porcheria?
    Ultima modifica di otto9due; 07-05-2015 a 00:41

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.