Guida [GUIDA]Simple Html DOM - Analizzare Pagine HTML in PHP

Stato
Discussione chiusa ad ulteriori risposte.

carbos

Utente Emerald
14 Agosto 2010
957
132
122
477
Ultima modifica da un moderatore:
Simple Html DOM è un framework molto utile se si deve prelevare informazioni da pagine HTML in modo veloce, senza dover fare Regex lunghissime o usare mille funzioni di PHP per lavorare sulle stringhe.
Sito Web: http://simplehtmldom.sourceforge.net/


INIZIALIZZAZIONE/INSTALLAZIONE


1) Prima di tutto, essendo una libreria esterna, dobbiamo scaricarla da qui: http://sourceforge.net/projects/simplehtmldom/files/
2) Dopo averla scaricata ci ritroveremo un file PHP dal nome "simple_html_dom.php" , successivamente andiamo nella nostra pagina PHP e scriviamo questo codice:
Codice:
<?php // apertura tag PHP
include_once 'directory/simple_html_dom.php' ; // includiamo il file dalla directory dove l'avete salvato
?> // chiusura tag PHP
3) Adesso iniziamo a utilizzare la libreria simple html dom, prima di tutto dobbiamo inizializzare la nostra funzione mettendo come parametro la pagina web o la stringa HTML che dobbiamo analizzare.
Se noi prendiamo l'HTML da una pagina web o comunque da un file, dobbiamo utilizzare la funzione file_get_html() come qui sotto:
Codice:
$html = file_get_html('http://www.google.com/');
Oppure se abbiamo una stringa HTML dobbiamo utilizzare quest'altra funzione:
Codice:
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
N.B. Alcuni siti vietano l'accesso alle loro pagine HTML tramite PHP, e pertanto può capitare che vi dia errore quando tentate di accedervi


METODO FIND - PRELEVARE INFORMAZIONI


Dopo aver fatto ciò , abbiamo istanziato l'oggetto tramite cui possiamo analizzare la nostra pagina.
Per accedere agli elementi HTML il framework ci mette a disposizione il metodo "find".
Codice:
$image = $html->find('img');
$image conterrà tutti i tag img della pagina, al primo parametro dobbiamo mettere l'elemento da cercare, c'è anche un secondo parametro opzionale, che serve a dire alla funzione quale dei tanti tag "img" dobbiamo prendere, esempio: $html->find('img' , 1); ci troverà il secondo tag img trovato.
N.B. per volere il primo tag img dovete metterci lo 0 .
N.B. nel caso vogliate controllare tutti i gli elementi di un tipo, basterà utilizzare un ciclo foreach sul find
Es:
Codice:
foreach($html->find('a') as $element)
       echo $element->href . '<br>';
nel caso vogliate un "elemento" con uno specifico id o class o qualunque attibuto, non dovrete fare altro che mettere (nel caso degli id) [id] alla fine del nome dell'elemento, come in questo esempio:
Codice:
$html->find('a[id]'); // troverà tutti i tag a con un id qualsiasi
// se in caso voi volesse un id specifico:
$html->find('a[id=nomeid]');
mentre nel caso volessimo un altro attributo, la sintassi è sempre la stessa $html->find('a[href=nomeurl]'); ( non l'ho testato ma dovrebbe funzionare) .
Questa libreria ci facilita anche altre cose, che spiegherò tutte qui sotto
Codice:
// per trovare tutti i tag con un certo id, possiamo usare:
$res = $html->find('#nomeid');
// per trovare tutti i tag con una certa class, possiamo usare:
$res = $html->find('.nomeclass');
// per trovare tutti i tag contenenti solo id o qualunque attributo:
$res = $html->find('*[id]');
// per trovare più tag si può fare:
$res = $html->find('a, img');


//Nel caso abbiamo div sotto altri tag o a loro volta dentro altri div, si può fare semplicemente:
$res = $html->find('div div div'); // troverà il terzo div


PRELEVARE TESTO DAL METODO FIND


Fatto ciò, abbiamo un piccolo problema, ovvero, come prendere il testo all'interno di questi tag.
Utilizzeremo come esempio lo stesso del manuale sul sito:
Codice:
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);
Simple Html Dom ci mette a disposizione 4 diversi tipi di stringhe da prelevare:
1) <b>tag</b> : il nome del tag dell'elemento preso (nel nostro caso div):
Codice:
echo $e->tag; // stamperà: " div"
2) <b>outertext</b> : Tutta la stringa in HTML compreso i tag delimitatori, ovvero <div> e </div>:
Codice:
echo $e->outertext; // Stamperà: " <div>foo <b>bar</b></div>"
3) <b>innertext</b>: Tutta la stringa HTML senza i delimitatori:
Codice:
echo $e->innertext; //Stamperà: " foo <b>bar</b>"
4) <b>plaintext</b>: Stamperà il testo senza tag HTML:
Codice:
echo $e->plaintext; //Stamperà: " foo bar"


Mentre per trovare tutti i commenti HTML di una pagina, basterà utilizzare: $es = $html->find('comment');
Mentre per i blocchi di testo possiamo utilizzare $es = $html->find('text');
Questa libreria ci dà anche la possibilità di eseguire operazioni sempre più complesse, ma non voglio andare oltre...

Guida creata dal sottoscritto, ovvero Carbos
 
Testato già in azienda un annetto fa per la creazione di uno spider, devo dire che è abbastanza utile. Se mi avanza del tempo, lo posto proprio.

Saluti.
 
Stato
Discussione chiusa ad ulteriori risposte.