Parsarea HTML și ștergerea ecranului cu Biblioteca Simplă HTML DOM

Dacă trebuie să parsezi codul HTML, expresiile regulate nu sunt calea de parcurs. În acest tutorial, veți învăța cum să utilizați un parser open source, ușor de învățat, pentru a citi, modifica și scuipa înapoi HTML din surse externe. Folosind nettuts ca un exemplu, veți învăța cum să obțineți o listă a tuturor articolelor publicate pe site și să le afișați.

Apropo, puteți găsi și parser pe Envato Market, cum ar fi HTML5 Parser.

Parser HTML5 pe Envato Market

Etapa 1. Preparare

Primul lucru pe care trebuie să-l faceți este să descărcați o copie a bibliotecii simpleHTMLdom, disponibilă gratuit de la sourceforge.

Există mai multe fișiere în descărcare, dar singura care aveți nevoie este fișierul simple_html_dom.php; restul sunt exemple și documentație.


Pasul 2. Elementele de bază ale analizei

Această bibliotecă este foarte ușor de folosit, dar există câteva elemente de bază pe care ar trebui să le revizuiți înainte de ao pune în acțiune.

Încărcarea HTML

$ html = noi simple_html_dom (); // Încărcați dintr-un șir $ html-> load ('

Salut Lume!

Au fost aici

„); // Încarcă un fișier $ html-> load_file ('http://net.tutsplus.com/');

Puteți crea obiectul inițial fie prin încărcarea HTML dintr-un șir, fie dintr-un fișier. Încărcarea unui fișier se poate face fie prin adresa URL, fie prin intermediul sistemului de fișiere local.

O notă de prudență: metoda load_file () își deleagă sarcina la file_get_contents din PHP. Dacă permit_url_fopen nu este setat la true în fișierul php.ini, este posibil să nu puteți deschide un fișier la distanță în acest fel. Ați putea întotdeauna să reveniți la biblioteca CURL pentru a încărca paginile la distanță în acest caz, apoi citiți-le cu metoda load ().

Accesarea informațiilor

După ce ai obiectul DOM, poți să începi să lucrezi cu acesta, folosind find () și creând colecții. O colecție este un grup de obiecte găsite printr-un selector - sintaxa este destul de similară cu jQuery.

  

Salut Lume!

Au fost aici.

În acest exemplu HTML, vom examina cum să accesăm informațiile din paragraful al doilea, să le schimbăm și apoi să ieșim rezultatele.

# creați și încărcați codul HTML include ('simple_html_dom.php'); $ html = noi simple_html_dom (); $ HTML-> de încărcare (“

Salut Lume!

Au fost aici

"); # obtine un element care reprezinta al doilea paragraf $ element = $ html-> find (" p "); # modify it $ element [ ieșire! echo $ html-> save ();

Folosind metoda find () întotdeauna se întoarce o colecție (array) de etichete, cu excepția cazului în care specificați că doriți doar copilul n, ca al doilea parametru.

Linii 2-4: Încărcați codul HTML dintr-un șir, după cum sa explicat anterior.

Linia 7: Această linie găsește totul

tag-uri în HTML, și le întoarce ca un matrice. Primul paragraf va avea un index de 0, iar paragrafele ulterioare vor fi indexate corespunzător.

linia 10: Aceasta accesează al doilea element din colecția noastră de paragrafe (indexul 1) și face o adăugare la atributul său interiortext. Textul interactiv reprezintă conținutul dintre etichete, în timp ce textul exterior reprezintă conținutul, inclusiv eticheta. Am putea înlocui eticheta în întregime cu ajutorul textului exterior.

Vom adăuga încă o linie și vom modifica clasa etichetei al doilea paragraf.

elementul $ [1] -> class = "class_name"; echo $ html-> salvați ();

HTML-ul rezultat al comenzii de salvare ar fi:

  

Salut Lume!

Suntem aici și suntem aici să rămânem.

Alți selectori

Iată câteva exemple de selectori. Dacă ați folosit jQuery, acestea vor părea foarte familiare.

# obțineți prima apariție a $ single = $ html-> find ('# foo', 0); # a obține toate elementele cu $ collection = $ html-> find ('. foo'); # obțineți toate etichetele de ancorare de pe o pagină $ collection = $ html-> find ('a'); # obțineți toate etichetele ancore care sunt în interiorul tagurilor H1 $ collection = $ html-> find ('h1 a'); # obțineți toate etichetele img cu titlul de "himom" $ collection = $ html-> find ('img [title = himom]');

Primul exemplu nu este complet intuitiv - toate interogările implicit colectează returnează, chiar și o interogare ID, care ar trebui să returneze doar un singur rezultat. Cu toate acestea, prin specificarea celui de-al doilea parametru, spunem "returnați doar primul element din această colecție".

Aceasta înseamnă că un singur element este un singur element, mai degrabă decât o serie de elemente cu un element.

Restul exemplelor sunt explicative.

Documentație

Documentația completă despre bibliotecă poate fi găsită la pagina de documentare a proiectului.


Pasul 3. Exemplul real al lumii

Pentru a pune această bibliotecă în acțiune, vom scrie un scenariu rapid pentru a elimina conținutul site-ului web Nettuts și vom produce o listă de articole prezente pe site după titlu și descriere ... doar ca un exemplu. Răzuirea este o zonă dificilă a paginii web și nu ar trebui executată fără permisiune.

includ ( 'simple_html_dom.php'); $ articles = array (); getArticles ( 'http://net.tutsplus.com/page/76/');

Începem prin includerea bibliotecii și apelarea funcției getArticles cu pagina pe care dorim să o parsingem. În acest caz, începem aproape de sfârșit și suntem amabili cu serverul Nettuts.

De asemenea, declarăm o matrice globală pentru a face mai simplu să strângeți toate informațiile despre articol într-un singur loc. Înainte de a începe parsarea, să aruncăm o privire la modul în care un rezumat al articolului este descris pe Nettuts+.

Acesta reprezintă un format post de bază pe site, inclusiv comentariile codului sursă. De ce sunt importante comentariile? Ele se numără ca noduri la parser.


Pasul 4. Pornirea funcției de parsing

funcția getArticles ($ page) articole globale $; $ html = noi simple_html_dom (); $ HTML-> load_file (pagina $); //… Mai Mult… 

Începem foarte simplu prin a ne pretinde global, creând un nou obiect simple_html_dom, apoi încărcând pagina pe care dorim să o analizăm. Această funcție va fi chemată mai târziu, așa că am setat-o ​​pentru a accepta adresa URL ca parametru.


Pasul 5. Găsirea informațiilor dorite

$ items = $ html-> find ('div [class = preview]'); ($ post-> copii (3) -> texte exterioare, $ post-> copii (6) -> first_child () -> externaltext ); 

Aceasta este carnea funcției getArticles. Va fi o privire mai atentă pentru a înțelege cu adevărat ce se întâmplă.

Linia 1: Creează o serie de elemente - div cu clasa de previzualizare. Acum avem o colecție de articole stocate în articole de $.

Linia 5: $ post se referă acum la un singur div de previzualizare a clasei. Dacă ne uităm la codul HTML original, putem vedea că al treilea copil este H1 care conține titlul articolului. Noi luăm acest lucru și îl atribuim articolelor $ [index] [0].

Amintiți-vă să începeți la 0 și să numărați comentariile atunci când încercați să determinați indicele adecvat al unui nod copil.

Linia 6: Cel de-al șaselea copil al postului $ este

. Vrem textul descriptiv din interior, deci luăm textul exterior al primului copil - acesta va include eticheta paragrafului. O singură înregistrare în articole acum arată astfel:

$ articles [0] [0] = "Numele articolului meu aici"; $ articles [0] [1] = "Aceasta este descrierea mea de articol"

Pasul 6, Paginare

Primul lucru pe care îl facem este să determinăm cum să găsim următoarea pagină. Pe Nettuts +, adresele URL sunt ușor de constatat, dar vom pretinde că nu sunt, și să obținem următorul link prin parsarea.

Dacă ne uităm la HTML, vedem următoarele:

"

Dacă există o pagină următoare (și nu va exista întotdeauna), vom găsi o ancoră cu clasa "nextpostslink". Acum, aceste informații pot fi folosite.

dacă ($ next = $ html-> găsi ('a [class = nextpostslink]', 0)) $ URL = $ next-> href; $ HTML-> clară (); unset ($ html); getArticles ($ URL); 

Pe prima linie, vedem dacă putem găsi o ancoră cu clasa nextpostslink. Luați notă specială despre al doilea parametru pentru find (). Aceasta specifică faptul că dorim să se întoarcă doar primul element (indexul 0) al colecției găsite. $ următorul va conține doar un singur element, mai degrabă decât un grup de elemente.

Apoi, atribuim link-ul HREF la variabila $ URL. Acest lucru este important pentru că suntem pe punctul de a distruge obiectul HTML. Datorită faptului că circulară php5 se referă la scurgeri de memorie, obiectul curent simple_html_dom trebuie șters și dezactivat înainte de a crea un altul. În caz contrar, vă puteți mânca toată memoria disponibilă.

În final, numim getArticles cu adresa URL a paginii următoare. Această recurzie se termină atunci când nu mai există pagini de analizat.


Pasul 7 Rezultatul rezultatelor

Mai intai vom incerca sa facem cateva curete de baza. Acest lucru este complet arbitrar - puteți face ieșirea dvs. să arate oricum doriți.

#main margin: 80px auto; lățime: 500px;  h1 font: bold 40px / 38px helvetica, verdana, sans-serif; margin: 0;  h1 a culoare: # 600; text-decoration: none;  p background: #ECECEC; font: 10px / 14px verdana, sans-serif; margine: 8px 0 15px; graniță: 1px #CCC solid; padding: 15px;  .item padding: 10px; 

Apoi vom pune un pic de PHP în pagină pentru a scoate informațiile stocate anterior.

"echo $ element [0]; echo $ element [1]; echo"
";>>

Rezultatul final este o singură pagină HTML care conține toate articolele, pornind de la pagina indicată de primul apel getArticles ().


Pasul 8 Concluzie

Dacă analizați o mulțime de pagini (de exemplu, întregul site), poate dura mai mult decât timpul maxim de execuție permis de serverul dvs. De exemplu, rularea de la mașina mea locală durează aproximativ o secundă pe pagină (inclusiv timpul pentru a fi preluat).

Pe un site ca Nettuts, cu un curent de 78 de pagini de tutoriale, acest lucru ar dura peste un minut.

Acest tutorial ar trebui să vă inițieze cu parsarea HTML. Există și alte metode de lucru cu DOM, inclusiv PHP construit într-unul, care vă permite să lucrați cu selectori puternici xpath pentru a găsi elemente. Pentru o utilizare ușoară și rapidă, găsesc această bibliotecă să fie una dintre cele mai bune. Ca o notă de încheiere, nu uitați întotdeauna să obțineți permisiunea înainte de răzuirea unui site; asta e important. Vă mulțumim pentru lectură!