Din când în când, dezvoltatorii trebuie să scadă paginile web pentru a obține informații de pe un site web. De exemplu, să presupunem că lucrați la un proiect personal în care trebuie să obțineți informații geografice despre capitalele diferitelor țări din Wikipedia. Introducerea manuală ar lua mult timp. Cu toate acestea, puteți face acest lucru foarte rapid prin răzuirea paginii Wikipedia cu ajutorul PHP. Veți putea, de asemenea, să analizați automat codul HTML pentru a obține informații specifice, în loc să treceți manual manual întreaga marcare.
În acest tutorial, vom afla despre un parser HTML rapid și ușor de utilizat, denumit DiDOM. Vom începe cu procesul de instalare și apoi vom învăța cum să extragem informații din diferite elemente dintr-o pagină web utilizând diferite tipuri de selectori cum ar fi etichete, clase etc..
Puteți instala cu ușurință DiDOM în directorul dvs. de proiect executând următoarea comandă:
compozitorul cere imangazaliev / didom
După ce ați executat comanda de mai sus, veți putea încărca codul HTML dintr-un șir, dintr-un fișier local sau dintr-o pagină Web. Iată un exemplu:
require_once ( 'furnizor / autoload.php'); utilizați documentul DiDom \ Document; $ document = document nou ($ washington_dc_html_string); $ document = document nou ('washington_dc.html', true); $ url = 'https://ro.wikipedia.org/wiki/Washington,_D.C.'; $ document = document nou ($ url, true);
Când decideți să analizați codul HTML dintr-un document, acesta ar putea fi deja încărcat și stocat într-o variabilă. În astfel de cazuri, puteți trece pur și simplu acea variabilă la Document()
și DiDOM va pregăti șirul pentru parsare.
Dacă HTML trebuie să fie încărcat dintr-un fișier sau dintr-o adresă URL, puteți trece ca acesta ca primul parametru Document()
și setați al doilea parametru la Adevărat
.
De asemenea, puteți crea un nou Document
obiect prin utilizarea document nou ()
fără parametri. În acest caz, puteți apela metoda loadHtml ()
pentru a încărca HTML dintr - un șir și loadHtmlFile ()
pentru a încărca HTML dintr-un fișier sau pagină web.
Primul lucru pe care trebuie să-l faceți înainte de a obține codul HTML sau textul dintr-un element este să găsiți elementul în sine. Cea mai ușoară modalitate de a face acest lucru este de a utiliza pur și simplu găsi()
și treceți selectorul CSS pentru elementul dorit ca primul parametru.
De asemenea, puteți trece XPath pentru un element ca primul parametru al lui găsi()
metodă. Cu toate acestea, acest lucru vă cere să treci Solicitare :: TYPE_XPATH
ca al doilea parametru.
Dacă doriți doar să utilizați valorile XPath pentru găsirea unui element HTML, puteți pur și simplu să utilizați xpath ()
în loc să treacă Solicitare :: TYPE_XPATH
ca al doilea parametru la găsi()
de fiecare data.
Dacă DiDOM poate găsi elemente care se potrivesc cu selectorul CSS trecut sau expresia XPATH, acesta va returna o serie de instanțe de DiDom \ Element
. Dacă nu se găsesc astfel de elemente, va reveni o matrice goală.
Deoarece aceste metode returnează o matrice, puteți accesa direct elementul ntalier de potrivire utilizând găsi () [n-1]
.
În exemplul următor, vom obține codul HTML interior din toate titlurile din primul și al doilea nivel din articolul Wikipedia despre Washington, D.C.
require_once ( 'furnizor / autoload.php'); utilizați documentul DiDom \ Document; $ document = document nou ("https://en.wikipedia.org/wiki/Washington,_D.C.", true); $ main_heading = $ document-> find ('h1.firstHeading') [0]; echo $ main_heading-> html (); $ sub_headings = $ document-> find ('h2'); foreach ($ sub_headings ca $ sub_head) if ($ sub_heading-> text ()! == 'Vezi și') echo $ sub_heading-> html (); altceva break;
Începem prin crearea unui nou obiect Document prin trecerea URL-ului articolului Wikipedia despre Washington, D.C. După aceea, primim elementul principal de poziție utilizând găsi()
și stocați-o într-o variabilă numită $ main_heading
. Acum vom putea apela metode diferite pe acest element, cum ar fi text()
, innerHtml ()
, html ()
, etc.
Pentru poziția principală, sunăm doar html ()
care returnează codul HTML al întregului element de titlu. În mod similar, putem obține HTML în interiorul unui element particular folosind innerHtml ()
metodă. Uneori, veți fi mai interesat de conținutul textului simplu al unui element în loc de codul său HTML. În astfel de cazuri, puteți pur și simplu utiliza text()
și se va face cu ea.
Titlurile de nivel doi împart pagina noastră Wikipedia în secțiuni bine definite. Cu toate acestea, poate doriți să scăpați de unele dintre subtitlurile respective, cum ar fi "A se vedea, de asemenea", "Note", etc.
O modalitate de a face acest lucru ar fi de a buclă prin toate nivelurile două titluri și de a verifica valoarea returnată de către text()
metodă. Am ieși din bucla dacă textul cu titlul returnat este "Vezi și".
Ați putea ajunge în mod direct la nivelul 4 sau 6, cu ajutorul a două titluri $ Pe documente> găsește ( 'h2') [3]
și $ Pe documente> găsește ( 'h2') [5]
respectiv.
Odată ce aveți acces la un anumit element, biblioteca vă permite să traversați în sus și în jos copacul DOM pentru a accesa cu ușurință alte elemente.
Puteți merge la părintele unui element HTML folosind mamă()
metodă. În mod similar, puteți ajunge la fratele următor sau anterior al unui element utilizând nextSibling ()
și previousSibling ()
metode.
Există o mulțime de metode disponibile pentru a avea acces la copiii unui element DOM, de asemenea. De exemplu, puteți ajunge la un anumit element copil folosind copil (n)
metodă. În mod similar, puteți obține accesul la primul sau ultimul copil al unui anumit element utilizând primul copil()
și ultimul copil()
metode. Aveți posibilitatea să ocupeți peste toți copiii unui element DOM folosind (copii)
metodă.
Odată ce ajungeți la un anumit element, veți putea accesa codul HTML etc. utilizând html ()
, innerHtml ()
, și text()
metode.
În exemplul următor, începem cu elemente de titlu de nivel doi și continuăm să verificăm dacă următorul element frate conține un text. Imediat ce găsim un element frățior cu un text, îl trimitem în browser.
require_once ( 'furnizor / autoload.php'); utilizați documentul DiDom \ Document; $ document = document nou ("https://en.wikipedia.org/wiki/Washington,_D.C.", true); $ sub_headings = $ document-> find ('h2'); pentru ($ i = 1; $ i < count($sub_headings); $i++) if($sub_headings[$i]->text ()! == 'Vezi și') $ next_sibling = $ sub_headings [$ i] -> nextSibling (); în timp ce (! $ next_elem-> html ()) $ next_sibling = $ next_sibling-> nextSibling (); echo $ next_elem-> html (). "
"; altceva break;
Puteți utiliza o tehnică similară pentru a trece prin toate elementele sibling și a ieși doar textul în cazul în care conține un anumit șir sau dacă elementul frate este un tag paragraf etc. După ce știți elementele de bază, găsirea informațiilor corecte este ușoară.
Capacitatea de a obține sau de a seta valoarea atributului pentru diferite elemente se poate dovedi foarte utilă în anumite situații. De exemplu, putem obține valoarea src atribut pentru toate img tag-uri în articolul nostru Wikipedia folosind $ Image_elem-> attr ( 'src')
. În mod similar, puteți obține valoarea href atribute pentru toate A tag-uri într-un document.
Există trei modalități de a obține valoarea unui atribut dat pentru un element HTML. Puteți utiliza funcția getAttribute ( 'attrName')
și trimiteți numele parametrului care vă interesează ca parametru. De asemenea, puteți utiliza funcția attr ( 'attrName')
metodă, care funcționează la fel getAttribute ()
. În cele din urmă, biblioteca vă permite de asemenea să obțineți direct valoarea de atribut folosind $ Elem-> attrName
. Aceasta înseamnă că puteți obține valoarea src atribut pentru un element de imagine direct prin utilizarea $ ImageElem-> src
.
require_once ( 'furnizor / autoload.php'); utilizați documentul DiDom \ Document; $ document = document nou ("https://en.wikipedia.org/wiki/Washington,_D.C.", true); $ images = $ document-> find ('img'); foreach ($ imagini ca $ imagine) echo $ image-> src. "
";
Odată ce aveți acces la src atribute, puteți scrie codul pentru a descărca automat toate fișierele imagine. În acest fel, veți putea economisi o mulțime de timp.
De asemenea, puteți seta valoarea unui atribut dat folosind trei tehnici diferite. În primul rând, puteți utiliza funcția setAttribute ('attrName', 'attrValue')
pentru a seta valoarea atributului. De asemenea, puteți utiliza funcția attr ('attrName', 'attrValue')
pentru a seta valoarea atributului. În cele din urmă, puteți seta valoarea atributului pentru un element dat folosind $ Elem-> attrName = 'attrValue'
.
De asemenea, puteți modifica documentul HTML încărcat folosind diferite metode furnizate de bibliotecă. De exemplu, puteți adăuga, înlocui sau elimina elemente din arborele DOM utilizând appendChild ()
, a inlocui()
, și elimina()
metode.
De asemenea, biblioteca vă permite să creați propriile elemente HTML pentru a le adăuga la documentul HTML original. Puteți crea un nou obiect Element utilizând element nou ("tagName", "tagContent")
.
Ține minte că vei primi unul Eroare nereușită: elementul de clasă nu a fost găsit eroare dacă programul dvs. nu conține linia utilizați DiDom \ Element
înainte de instanțierea obiectului elementului.
Odată ce ai elementul, poți să îl adaugi la alte elemente din DOM utilizând appendChild ()
sau puteți utiliza funcția a inlocui()
metoda de a utiliza noul element instanțiat ca înlocuitor al unui element HTML vechi în document. Următorul exemplu ar trebui să contribuie la clarificarea în continuare a acestui concept.
require_once ( 'furnizor / autoload.php'); utilizați documentul DiDom \ Document; utilizați DiDom \ Element; $ document = document nou ("https://en.wikipedia.org/wiki/Washington,_D.C.", true); // Aceasta va duce la eroare. echo $ document-> find ('h2.test-heading') [0] -> html (). " $ test_heading = Element nou ('h2', 'Aceasta este o rubrică de testare.'); $ test_heading-> class = 'test-heading'; $ Pe documente> găsește ( 'h1') [0] -> înlocuiți ($ test_heading); echo $ document-> find ('h2.test-heading') [0] -> html (). "
Inițial, nu există h2 element în documentul nostru cu clasa test titlu. Prin urmare, vom continua să obținem o eroare dacă încercăm să accesăm un astfel de element.
După ce verificăm că nu există un astfel de element, vom crea un nou h2 element și să schimbe valoarea acestuia clasă atribuit lui test titlu.
După aceea, înlocuim primul h1 element în documentul nou creat h2 element. Utilizarea găsi()
metoda de pe documentul nostru din nou pentru a găsi h2 curs cu clasa test titlu va reveni la un element acum.
Acest tutorial a acoperit elementele de bază ale parserului HTML DiDOM PHP. Am început cu instalarea și apoi am învățat cum să încărcați HTML dintr-un șir, un fișier sau o adresă URL. După aceea, am discutat despre cum să găsim un element particular pe baza selectorului CSS sau XPath. Am învățat, de asemenea, cum să obținem frații, părinții sau copiii unui element. Restul secțiunilor au acoperit modul în care putem manipula atributele unui anumit element sau putem adăuga, elimina și înlocui elemente dintr-un document HTML.
.