Analisi dell'HTML con PHP usando DiDOM

Ogni tanto, gli sviluppatori hanno bisogno di raschiare le pagine web per ottenere alcune informazioni da un sito web. Ad esempio, diciamo che stai lavorando a un progetto personale in cui devi ottenere informazioni geografiche sulle capitali di diversi paesi da Wikipedia. Inserirla manualmente richiederebbe molto tempo. Tuttavia, puoi farlo molto rapidamente raschiando la pagina di Wikipedia con l'aiuto di PHP. Sarai anche in grado di analizzare automaticamente l'HTML per ottenere informazioni specifiche invece di passare manualmente l'intero markup.

In questo tutorial, apprenderemo un parser HTML veloce e facile da usare chiamato DiDOM. Inizieremo con il processo di installazione e impareremo come estrarre informazioni da diversi elementi in una pagina web utilizzando diversi tipi di selettori come tag, classi, ecc..

Installazione e utilizzo

Puoi installare facilmente DiDOM nella directory del tuo progetto eseguendo il seguente comando:

il compositore richiede imangazaliev / didom

Una volta eseguito il comando sopra, sarai in grado di caricare l'HTML da una stringa, un file locale o una pagina web. Ecco un esempio:

require_once ( 'vendor / autoload.php'); usa DiDom \ Document; $ document = new Document ($ washington_dc_html_string); $ document = new Document ('washington_dc.html', vero); $ url = 'https://en.wikipedia.org/wiki/Washington,_D.C.'; $ document = new Document ($ url, true);

Quando decidi di analizzare HTML da un documento, potrebbe essere già caricato e memorizzato in una variabile. In questi casi, puoi semplicemente passare la variabile a Documento() e DiDOM preparerà la stringa per l'analisi.

Se l'HTML deve essere caricato da un file o da un URL, puoi passarlo come primo parametro Documento() e impostare il secondo parametro su vero.

Puoi anche creare un nuovo Documento oggetto usando nuovo documento () senza parametri. In questo caso, puoi chiamare il metodo loadHTML () caricare HTML da una stringa e loadHtmlFile () per caricare HTML da un file o una pagina web.

Trovare elementi HTML

La prima cosa che devi fare prima di ottenere l'HTML o il testo da un elemento è trovare l'elemento stesso. Il modo più semplice per farlo è usare semplicemente il trova() metodo e passare il selettore CSS per l'elemento desiderato come primo parametro.

È anche possibile passare XPath per un elemento come primo parametro di trova() metodo. Tuttavia, questo richiede di passare Query :: TYPE_XPATH come secondo parametro.

Se si desidera utilizzare solo i valori XPath per trovare un elemento HTML, è sufficiente utilizzare il comando xpath () metodo invece di passare Query :: TYPE_XPATH come secondo parametro a trova() ogni volta.

Se DiDOM può trovare elementi che corrispondono al selettore CSS passato o all'espressione XPATH, restituirà un array di istanze di DiDom \ Element. Se non vengono trovati tali elementi, restituirà un array vuoto.

Poiché questi metodi restituiscono un array, è possibile accedere direttamente all'ennesimo elemento corrispondente utilizzando find () [n-1].

Un esempio

Nel seguente esempio, otterremo l'HTML interno da tutti i titoli di primo e secondo livello nell'articolo di Wikipedia su Washington, D.C.

require_once ( 'vendor / autoload.php'); usa DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', vero); $ main_heading = $ document-> find ('h1.firstHeading') [0]; echo $ main_heading-> html (); $ sott_headings = $ document-> find ('h2'); foreach ($ sub_headings as $ sub_heading) if ($ sub_heading-> text ()! == 'Vedi anche') echo $ sub_heading-> html ();  else break; 

Iniziamo creando un nuovo oggetto Document passando l'URL dell'articolo di Wikipedia su Washington, D.C. Dopo di ciò, otteniamo l'elemento principale usando il trova() metodo e memorizzarlo all'interno di una variabile chiamata $ main_heading. Ora potremo chiamare diversi metodi su questo elemento come testo(), innerHtml (), html (), eccetera.

Per la voce principale, chiamiamo semplicemente il html () metodo che restituisce l'HTML dell'intero elemento di titolo. Allo stesso modo, possiamo ottenere l'HTML all'interno di un particolare elemento usando il innerHtml () metodo. A volte, sarai più interessato al contenuto di testo normale di un elemento anziché al suo HTML. In questi casi, puoi semplicemente usare il testo() metodo e sii fatto con esso.

I due livelli di livello dividono la nostra pagina di Wikipedia in sezioni ben definite. Tuttavia, potresti voler eliminare alcuni di questi sottotitoli come "Vedi anche", "Note", ecc.

Un modo per farlo sarebbe quello di scorrere tutti i titoli di livello due e controllare il valore restituito dal testo() metodo. Interrompiamo il ciclo se il testo dell'intestazione restituita è "Vedi anche".

Si può arrivare direttamente al livello 4 o 6 di due usando $ Documento-> find ( 'H2') [3] e $ Documento-> find ( 'H2') [5] rispettivamente.

Attraversando su e giù il DOM

Una volta che hai accesso ad un particolare elemento, la libreria ti permette di attraversare su e giù l'albero DOM per accedere facilmente ad altri elementi.

Puoi andare al genitore di un elemento HTML usando il genitore() metodo. Allo stesso modo, puoi raggiungere il fratello successivo o precedente di un elemento usando il nextSibling () e previousSibling () metodi.

Ci sono molti metodi disponibili per ottenere l'accesso ai figli di un elemento DOM. Ad esempio, puoi ottenere un particolare elemento figlio usando il bambino (n) metodo. Allo stesso modo, puoi ottenere l'accesso al primo o all'ultimo figlio di un particolare elemento usando il Primogenito() e ultimo bambino() metodi. Puoi eseguire il loop su tutti i figli di un particolare elemento DOM usando il bambini() metodo.

Una volta che arrivi ad un particolare elemento, sarai in grado di accedere al suo codice HTML ecc. Usando il html (), innerHtml (), e testo() metodi.

Nell'esempio seguente, iniziamo con gli elementi di titolo di livello due e continuiamo a controllare se il prossimo elemento di pari livello contiene del testo. Non appena troviamo un elemento di pari livello con del testo, lo inviamo al browser.

require_once ( 'vendor / autoload.php'); usa DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', vero); $ sott_headings = $ document-> find ('h2'); per ($ i = 1; $ i < count($sub_headings); $i++)  if($sub_headings[$i]->text ()! == 'Vedi anche') $ next_sibling = $ sottotitoli [$ i] -> nextSibling (); while (! $ next_elem-> html ()) $ next_sibling = $ next_sibling-> nextSibling ();  echo $ next_elem-> html (). "
"; else break;

È possibile utilizzare una tecnica simile per scorrere tutti gli elementi di pari livello e generare il testo solo se contiene una stringa particolare o se l'elemento fratello è un tag di paragrafo, ecc. Una volta acquisite le nozioni di base, trovare le informazioni giuste è facile.

Manipolazione degli attributi degli elementi

La possibilità di ottenere o impostare il valore dell'attributo per elementi diversi può rivelarsi molto utile in determinate situazioni. Ad esempio, possiamo ottenere il valore di src attributo per tutto il img tag nel nostro articolo di Wikipedia usando $ Image_elem-> attr ( 'src'). In modo simile, puoi ottenere il valore di href attributi per tutto il un tag in un documento.

Esistono tre modi per ottenere il valore di un determinato attributo per un elemento HTML. Puoi usare il getAttribute ( 'attrName') metodo e passare il nome dell'attributo a cui sei interessato come parametro. Puoi anche usare il attr ( 'attrName') metodo, che funziona proprio come getAttribute (). Infine, la libreria consente anche di ottenere direttamente il valore dell'attributo utilizzando $ Elem-> attrName. Ciò significa che puoi ottenere il valore di src attributo per un elemento immagine direttamente usando $ ImageElem-> src.

require_once ( 'vendor / autoload.php'); usa DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', vero); $ images = $ document-> find ('img'); foreach ($ immagini come $ immagine) echo $ image-> src. "
";

Una volta che hai accesso a src attributi, è possibile scrivere il codice per scaricare automaticamente tutti i file immagine. In questo modo, sarai in grado di risparmiare un sacco di tempo.

Puoi anche impostare il valore di un determinato attributo utilizzando tre diverse tecniche. Innanzitutto, puoi usare il setAttribute ('attrName', 'attrValue') metodo per impostare il valore dell'attributo. Puoi anche usare il attr ('attrName', 'attrValue') metodo per impostare il valore dell'attributo. Infine, puoi impostare il valore dell'attributo per un dato elemento usando $ Elem-> attrName = 'attrValue'.

Aggiunta, rimozione e sostituzione di elementi

È inoltre possibile apportare modifiche al documento HTML caricato utilizzando diversi metodi forniti dalla libreria. Ad esempio, puoi aggiungere, sostituire o rimuovere elementi dall'albero DOM usando il appendChild (), sostituire(), e rimuovere() metodi.

La libreria consente anche di creare i propri elementi HTML per aggiungerli al documento HTML originale. Puoi creare un nuovo oggetto Element usando nuovo elemento ('tagName', 'tagContent').

Tieni presente che otterrai un Errore non rilevato: classe 'elemento' non trovata errore se il tuo programma non contiene la linea usa DiDom \ Element prima di creare un'istanza dell'oggetto elemento.

Una volta ottenuto l'elemento, puoi aggiungerlo ad altri elementi nel DOM utilizzando il appendChild () metodo o è possibile utilizzare il sostituire() metodo per utilizzare l'elemento appena istanziato in sostituzione di un vecchio elemento HTML nel documento. Il seguente esempio dovrebbe aiutare a chiarire ulteriormente questo concetto.

require_once ( 'vendor / autoload.php'); usa DiDom \ Document; usa DiDom \ Element; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', vero); // Ciò comporterà un errore. echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n"; $ test_heading = new Element ('h2', 'Questa è l'intestazione di prova.'); $ test_heading-> class = 'test-heading'; $ Documento-> find ( 'H1') [0] -> sostituire ($ test_heading); echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n";

Inizialmente, non c'è h2 elemento nel nostro documento con la classe test-rubrica. Pertanto, continueremo a ricevere un errore se proviamo ad accedere a tale elemento.

Dopo aver verificato che non esiste un tale elemento, ne creiamo uno nuovo h2 elemento e cambiare il valore del suo classe attribuire a test-rubrica.

Dopo di ciò, sostituiamo il primo h1 elemento nel documento con il nostro nuovo creato h2 elemento. Usando il trova() metodo sul nostro documento di nuovo per trovare il h2 voce con classe test-rubrica restituirà un elemento ora.

Pensieri finali

Questo tutorial illustra le basi del parser HTML DiDOM PHP. Abbiamo iniziato con l'installazione e poi abbiamo imparato come caricare l'HTML da una stringa, un file o un URL. Successivamente, abbiamo discusso su come trovare un particolare elemento basato sul suo selettore CSS o XPath. Abbiamo anche imparato come ottenere i fratelli, i genitori o i figli di un elemento. Il resto delle sezioni illustrava come possiamo manipolare gli attributi di un particolare elemento o aggiungere, rimuovere e sostituire elementi in un documento HTML.

.