Analizator universal de conținut PHP. Citirea unui fișier în PHP

Sarcina de a analiza și procesa informațiile necesare de pe un site terță parte se confruntă cu un dezvoltator web destul de des și din mai multe motive: în acest fel vă puteți umple proiectul cu conținut, puteți încărca dinamic unele informații și așa mai departe.

În astfel de cazuri, programatorul se confruntă cu întrebarea: pe care dintre zecile de biblioteci să aleagă? În acest articol, am încercat să luăm în considerare cele mai populare opțiuni și să o alegem pe cea mai bună.

Expresii obisnuite

Chiar dacă „cele obișnuite” sunt primul lucru care vă vine în minte, nu ar trebui să le folosiți pentru proiecte reale.

Da, expresiile regulate fac cea mai bună treabă cu sarcini simple, dar utilizarea lor devine mult mai dificilă atunci când trebuie să analizați o bucată mare și complexă de cod HTML, care, în plus, nu se potrivește întotdeauna cu niciun model specific și poate conține, în general, erori de sintaxă. .

În loc să vă „terminați” expresia obișnuită cu fiecare cea mai mică modificare a codului, vă recomandăm să folosiți instrumentele de mai jos - este mai simplu, mai convenabil și mai fiabil.

XPath și DOM

htmlSQL

Dacă nu utilizați PHP, puteți consulta această scurtă listă de instrumente similare pentru alte limbaje de programare.

Data publicării: 01/03/2018

Salutări, prieteni! 🙂

Cred că, dacă nu toți, atunci cu siguranță majoritatea dintre voi ați întâlnit în practică nevoia de a citi informații din fișierele txt la nivelul scripturilor de server. Cel puțin, am avut mai multe astfel de cazuri, despre ultimul dintre care vă voi povesti astăzi.

Nu este nimic complicat în acest sens, dar uneori îți scapă ochii din cauza abundenței de opțiuni oferite de limbajele de pe server. Dacă vorbim în mod specific despre PHP, pe care îl programez în prezent, atunci folosind funcțiile sale puteți citi conținutul fișierelor linie cu linie, sau în întregime într-un șir, sau într-o matrice, iar pentru cea din urmă opțiune există mai multe moduri ... Acestea sunt plăcintele :)

Din păcate, aceste metode funcționează la viteze diferite pentru fișiere cu structuri diferite și nu există nici măcar un cuvânt despre viteza lor în documentația oficială; acest lucru poate fi judecat doar în practică, trecând prin toate opțiunile posibile.

Așa că astăzi vă voi arăta cum funcționează diferitele funcții de citire a fișierelor PHP, astfel încât atunci când aveți nevoie să creați un parser de fișiere PHP pentru a rezolva problemele din lumea reală, să știți din ce să alegeți. De asemenea, vă voi spune exact cum să faceți alegerea corectă în „condiții de luptă”.

Merge! 🙂

Crearea unui parser de fișiere PHP - condiții inițiale

Înainte de a începe, câteva cuvinte despre sarcina pentru care am creat un parser de fișiere în PHP, iar apoi l-am ales pe cel optim dintre opțiunile implementate.

Odată am avut o problemă la serviciu în care baza de date stoca numerele de telefon ale utilizatorilor în format greșit. Desigur, am remediat bug-ul fără probleme.

Dar ce să faci cu informațiile incorecte care erau deja stocate în baza de date la acel moment? Desigur, a trebuit înlocuit cu cel corect.

Pentru a face acest lucru, mi s-a oferit un fișier text cu ID-uri de utilizator și numerele lor de telefon, care trebuia transferat în baza de date.

Trebuie să spun că s-a dovedit a fi destul de greu: 352 KB și 8223 de rânduri de text, fiecare dintre acestea conținând ID-ul utilizatorului și numărul său de telefon în format user_id:număr_de_telefon.

Într-un cuvânt, întreaga sarcină a constat în citirea rând cu linie a fișierului PHP prin extragerea identificatorului și a numărului de telefon din linie, urmată de actualizarea numărului de telefon al utilizatorului în baza de date, găsit prin ID.

Proiectul meu a fost implementat pe framework-ul Yii PHP, prin urmare, în exemple de cod suplimentare veți găsi elemente ale API-ului său pentru lucrul cu baza de date, în special, așa că nu vă alarmați :)

După ce am analizat construcțiile disponibile în limbă, precum și experiența altor dezvoltatori, culese bit cu bit pe Internet, am reușit să identific 4 metode, pe care vi le voi demonstra în continuare.

Ei bine, atunci vă voi spune după ce criterii și cum exact am ales cea mai bună opțiune dintre ele. Și, desigur, voi împărtăși rezultatele :)

Deci acest articol este un excelent antrenament în răbdare :) Esența acestuia va fi un studiu detaliat al următorului material până la rezultatele care vă vor aștepta la final. Pe parcurs, apropo, poți să-ți lucrezi și la imaginație, imaginându-ți exact cum va fi aleasă varianta ideală.

Citirea unui fișier în PHP linie cu linie folosind fgets()

Ca rezultat, analizatorul meu de fișiere PHP care implementează acest algoritm a luat următoarea formă:

find("unique_id IN (:id1, :id2)", array(":id1" => strtolower($params), ":id2" => strtoupper($params))); if ($client) ( $client->telefon = str_replace(array("\r", "\n"), "", $params); $client->save(); ) ) ) dacă (!feof ( $fh)) ( echo "Eroare: fgets() neașteptat\n"; ) fclose($fh); ) else echo "Verificați numele fișierului, fișierul nu există!"; )

Îmi voi descifra puțin scrisul dacă cineva are dificultăți în a o înțelege.

La început, variabila $nume fișier valoarea este atribuită numelui fișierului care va fi analizat, cu calea completă către acesta. Urmează PHP care verifică dacă fișierul există și dacă este citibil folosind funcții fisierul exista()Și este_citit() respectiv.

Dacă totul este în regulă, atunci deschideți fișierul folosind funcția fopen(), care este apelat cu instrucțiunea de control al erorilor PHP pentru a opri ieșirea erorilor generate de această funcție. Am decis să îl folosesc pentru a-mi genera propriul mesaj de eroare în loc de cel standard.

Dacă reușim să deschidem fișierul, atunci parcurgem toate liniile lui într-o buclă până când fișierul se termină, iar, dacă linia nu este goală, o separăm la caracterul două puncte cu funcția exploda().

Apoi verificăm că id-ul utilizatorului și numărul lui de telefon nu sunt goale, căutăm utilizatorul în baza de date după ID și, dacă există unul, apoi actualizăm numărul lui de telefon eliminând mai întâi cratima și linia nouă din valoarea numărului.

Ei bine, am folosit și funcții PHP strtolower()Și strtoupper() sa verifice existenta in baza de date a unui utilizator cu identificatori care ar putea fi inregistrati in registre diferite, deoarece în cazul meu au constat din simboluri și numere.

PHP parsează un fișier într-o matrice folosind file()

Această metodă de citire a unui fișier în PHP implică utilizarea funcției fişier(), care deschide un fișier și își pune conținutul într-o matrice. În acest caz, elementele matricei vor fi exact liniile fișierului citit, ceea ce este perfect în situația mea.

Codul pentru această versiune a parserului de fișiere PHP este următorul:

find("unique_id IN (:id, :id2)", array(":id" => strtolower($params), ":id2" => strtoupper($params))); if ($client) ( $client->telefon = str_replace(array("\r", "\n"), "", $params); $client->

După cum puteți vedea, aceasta diferă de metoda anterioară de a citi un fișier în PHP doar la început, unde fișierul este deschis și citit imediat de către funcție fişier()în loc de o grămadă fopen() + fgets(), Ca înainte.

PHP citește un fișier într-o variabilă folosind fread()

O altă funcție PHP pentru analizarea unui fișier este friad(), cu care puteți citi diferite fragmente dintr-un fișier de o lungime specificată. Pentru a citi întregul fișier în PHP, am specificat dimensiunea fișierului obținut folosind funcția ca dimensiune a fragmentului mărime fișier():

find("unique_id IN (:id1, :id2)", array(":id1" => strtolower($params), ":id2" => strtoupper($params))); if ($client) ( $client->telefon = str_replace(array("\r", "\n"), "", $params); $client->save(); ) ) ) ) else echo " Verificați numele fișierului, fișierul nu există!"; )

Această metodă de citire a unui fișier folosind mijloace PHP este, de fapt, foarte asemănătoare cu cea anterioară, deoarece, în ciuda faptului că, cu ajutorul PHP, datele din fișier sunt citite inițial nu într-o matrice, ci într-o variabilă șir. , atunci este încă convertit într-o matrice , deoarece Este mai ușor să lucrezi cu un șir.

Cel mai simplu mod de a converti un șir într-o matrice în PHP este să utilizați funcția explode(), care a fost deja folosită astăzi, începutul caracterului șir fiind trecut ca delimitator.

Crearea unui parser de fișiere PHP bazat pe file_get_contents()

Ei bine, și în cele din urmă, am decis să implementez parsarea fișierelor PHP folosind funcția file_get_contents(), care este tocmai destinat citirii întregului fișier într-o linie, adică. funcționează practic ca fread($fp, dimensiunea fișierului($nume fișier)).

Singura excepție este că file_get_contents() însuși deschide fișierul și îl citește, în timp ce pentru a utiliza fread() trebuia mai întâi să deschideți fișierul prin fopen() și să obțineți pointerul său pentru utilizare ulterioară.

În general, codul de analiză a fișierelor PHP bazat pe file_get_contents() va fi aproape același ca în cazul precedent:

find("unique_id IN (:id1, :id2)", array(":id1" => strtolower($params), ":id2" => strtoupper($params))); if ($client) ( $client->telefon = str_replace(array("\r", "\n"), "", $params); $client->save(); ) ) ) ) else echo " Verificați numele fișierului, fișierul nu există!"; )

Asta e tot. Este timpul să rezumați performanța tuturor opțiunilor enumerate și să aflați care parser de fișiere PHP s-a dovedit a fi cel mai optim pentru utilizare ulterioară.

Care este cel mai bun mod de a procesa fișiere în PHP?

Pentru a alege cea mai optimă dintre opțiunile găsite, adică. cel mai rapid, am decis să determin în fiecare caz. Pentru a face acest lucru, am folosit tehnica descrisă în articolul de la link.

Funcțiile de citire a fișierelor PHP în sine sunt destul de rapide, așa că pentru a obține măcar niște cifre mai mult sau mai puțin tangibile pentru timpul lor de funcționare, am lăsat în mod deliberat operațiunile bazei de date în fragmentele testate, care au fost aceleași în toate cazurile.

Pentru comoditate, am decis, de asemenea, să rotunjesc timpul de rulare al scriptului PHP la a treia zecimală, adică. până la miimi de secunde (deși ar fi putut fi limitat la sutimi, de fapt).

Îmi amintesc când eram la școală și îmi scriam lucrarea științifică la fizică (da, am avut o astfel de experiență :) în timpul apărării acesteia în fața profesorilor universitari, mi s-a reproșat constant că nu am destule experimente (am făcut 3 experimente pentru fiecare caz). ). „Luminarii științei” au numit cifre de 100 sau cel puțin 10 experimente pentru a compara diferite situații, astfel încât să se poată face un fel de comparație și să minimizeze probabilitatea ca unul să fie accidental superior celuilalt.

Da, mi-a fost greu atunci de la ei, dar am învățat bine recomandările lor de care îmi amintesc și acum, deși au trecut mai bine de 10 ani de atunci. Mai mult, aceste recomandări s-au bazat într-adevăr pe legile statisticii matematice și teoria probabilității.

Ei bine, în acest articol nu pretind că experimentele mele actuale sunt științifice, așa că am considerat că numărul de 100 de experimente este prea mare, iar procesul de efectuare a acestora este prea plictisitor.

Drept urmare, am decis să mă limitez la 10 experimente pentru fiecare versiune a parserului de fișiere PHP, care, după cum s-a dovedit în cele din urmă, a fost suficient pentru a identifica un lider clar, fără nicio manipulare a faptelor și indiciilor în sutimi și miimi. de o secundă de superioritate.

Rezultatele calculelor timpului de funcționare a parsoarelor de fișiere PHP pe care le-am dezvoltat sunt prezentate în tabelul următor și sortate după funcțiile PHP pe care aceștia lucrează.

Experiment fgets() fişier() friad() file_get_contents()
1 9,147 9,722 10,539 2,008
2 8,950 9,006 9,495 1,733
3 8,821 8,845 9,207 1,642
4 8,717 8,876 8,931 1,758
5 9,010 9,091 8,703 1,635
6 9,110 8,640 9,712 1,633
7 9,074 9,626 9,13 1,645
8 8,886 9,204 9,048 1,701
9 8,667 8,918 9,438 1,713
10 8,852 9,197 9,537 1,567
In medie 8,923 9,113 9,374 1,704

După cum puteți vedea, pe lângă timpii de execuție a scriptului în fiecare dintre cele 10 experimente, am decis să calculez temperatura medie în spital :)

Și anume, timpul mediu de funcționare aritmetic al fiecărui parser de fișiere PHP, astfel încât liderul să poată fi identificat.

Și s-a dovedit a fi, după cum puteți vedea, ultima opțiune, implementată pe baza funcției file_get_contents(), care citește conținutul fișierului într-o variabilă șir și apoi îl convertește într-o matrice și îl procesează într-o buclă.

Toate celelalte versiuni ale analizoarelor de fișiere PHP funcționează aproximativ la aceeași viteză.

De ce exact și-a depășit concurenții, sincer nu am nici cea mai mică idee. Pot doar să presupun că operația de citire a unui fișier într-un șir folosind file_get_contents() necesită mai puține resurse decât generarea unei matrice gata făcute de șiruri folosind fişier().

Iar superioritatea față de fgets() și fread() poate fi atribuită faptului că înainte de a le folosi trebuie să deschideți fișierul folosind fopen(), ceea ce necesită timp.

Da, de fapt, nu contează, pentru că... numerele vorbesc de la sine: datorită utilizării funcției file_get_contents() Analizatorul de fișiere PHP bazat pe acesta funcționează de 5 ori mai rapid decât altele, ceea ce mi-a influențat decizia de a-l folosi în practică.

Analizarea unui fișier în PHP - concluzii

După cum am spus deja la început, experimentele mele nu sunt impecabile și nu merită să mă bazez doar pe rezultatele obținute în timpul lor, deoarece, în ciuda vitezei file_get_contents()în situația mea, există momente în care este mult mai convenabil și mai eficient să folosești celelalte analizoare de fișiere PHP pe care le-am dat.

În plus, nu uitați că PHP în sine este un limbaj de programare sincron, adică. toate operațiunile serverului au loc secvenţial, fără posibilitatea de a configura execuția lor paralelă, inclusiv pe diferite nuclee ale procesorului serverului.

În consecință, timpul de execuție al operațiilor scrise în cod PHP poate fi influențat de o serie de factori, printre care principalul este încărcarea kernel-ului la momentul rulării aplicației PHP.

Am simțit acest lucru în special în timpul experimentelor când același parser de fișiere PHP a funcționat în 9, apoi în 12 și apoi din nou în 9 secunde la trei iterații consecutive din cauza lansării banale a Windows Explorer în timpul celui de-al doilea caz, care, desigur, de asemenea, necesită resurse server.

Ținând cont de aceste caracteristici, am efectuat experimente aproape simultan, unul după altul, cu același set de programe rulând, pentru a nu irosi resursele hardware ale serverului.

Prin urmare, în viitor, atunci când efectuați experimente similare cu constructe PHP, procedați în același mod, deoarece aceasta este, de fapt, singura modalitate de a aduce experimentele la condiții echitabile.

Dacă lucrați cu limbaje asincrone de pe partea de server (C#, Java) sau tehnologii (Node.js, de exemplu), atunci, dacă este posibil, pentru experimente, creați un fir separat care va rula pe un nucleu de procesor dedicat.

Ei bine, dacă nu puteți găsi un nucleu complet nefolosit (ceea ce nu este surprinzător având în vedere nivelul software-ului modern), atunci îl puteți găsi cel puțin pe cel mai ușor încărcat, sau cel puțin unul cu o sarcină statică care nu se modifică în timp. .

Pentru a rezuma, vreau să spun că fragmentele de cod prezentate în articol pot fi folosite nu numai pentru analizarea fișierelor text în PHP, ci sunt perfecte și pentru alte formate, de exemplu, pentru analizarea fișierelor CSV.

Scrie feedback-ul tău, atât pozitiv, cât și negativ, în comentariile de sub articol - am nevoie de oricare dintre opiniile tale pentru dezvoltare ulterioară :)

Ne mai vedem! 🙂

P.S.: dacă aveți nevoie de un site web sau trebuie să faceți modificări unuia existent, dar nu există timp sau dorință pentru asta, îmi pot oferi serviciile.

Peste 5 ani de experiență dezvoltarea site-ului profesional. Lucreaza cu PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, Reacţiona, unghiularși alte tehnologii de dezvoltare web.

Experienta in dezvoltarea de proiecte la diferite niveluri: pagini de destinație, site-uri web corporative, Magazine online, CRM, portaluri. Inclusiv sprijin și dezvoltare Proiecte HighLoad. Trimiteți aplicațiile prin e-mail [email protected].

Dacă trebuie să analizați un document HTML, expresiile regulate nu sunt cea mai bună modalitate de a face acest lucru. În plus, scrierea acestora este un proces care necesită multă muncă și reduc viteza aplicației PHP. În acest articol, veți învăța cum să utilizați un parser HTML gratuit pentru a citi, modifica și extrage unele elemente DOM din paginile HTML. Mai mult, resursa HTML poate fi o sursă externă. Adică adresa unei pagini HTML pe un alt domeniu. Folosind site-ul ca exemplu sitear.ru, veți învăța cum să obțineți și să afișați o listă cu toate materialele publicate pe pagina principală a site-ului. Cu alte cuvinte, vei face ceea ce trebuie să faci, analizând HTML folosind PHP. În acest caz, PHP înseamnă biblioteca simplă HTML DOM.

Doar urmați toți pașii din articol și veți învăța o mulțime de lucruri noi și utile pentru dvs.!

Pasul 1 – Pregătire

Mai întâi, trebuie să descărcați o copie simplu HTML dom biblioteci. Descarca gratis.

În arhivă veți găsi mai multe fișiere, dar avem nevoie doar de unul - simple_html_dom.php. Toate celelalte sunt exemple și documentație.

Pasul 2 – Noțiuni de bază pentru analizarea HTML

Această bibliotecă este foarte ușor de utilizat, dar totuși, trebuie să înțelegeți câteva elemente de bază înainte de a o folosi.

$html = new simple_html_dom(); // Încarcă dintr-un șir $html->load("

Salut Lume!

"); // Încarcă un fișier $html->load_file("http://site/");

Este simplu, poți crea un obiect încărcând HTML dintr-un șir. Sau încărcați codul HTML dintr-un fișier. Puteți descărca fișierul de la adresa URL sau de pe sistemul de fișiere local (server).

Important de reținut: Metoda load_file() funcționează folosind funcția PHP file_get_contents. Dacă în fișierul dvs. php.ini, parametrul allow_url_fopen nu este setat la true, nu veți putea primi fișiere HTML la adresa de la distanță. Dar, veți putea descărca aceste fișiere folosind biblioteca CURL. Apoi, citiți conținutul folosind metoda load().

Accesarea obiectelor HTML DOM


Să presupunem că avem deja un obiect DOM cu o structură ca cea din imaginea de mai sus. Puteți începe să lucrați cu el folosind metoda find() și creând colecții. Colecțiile sunt grupuri de obiecte găsite folosind selectoare - sintaxa este oarecum similară cu jQuery.

Salut Lume!

Au fost aici.



Folosind acest exemplu de cod HTML, vom învăța cum să accesăm informațiile conținute în al doilea paragraf (p). De asemenea, vom modifica informațiile primite și vom afișa rezultatul pe afișaj.

// crearea unui obiect parser și obținerea HTML include("simple_html_dom.php"); $html = new simple_html_dom(); $html->load("

Salut Lume!



"); // obținerea de matrice de paragrafe $element = $html->find("p"); // schimbarea informațiilor din interiorul unui paragraf $element->innertext .= "și noi suntem aici pentru a rămâne."; // iese echo $html->save();

După cum puteți vedea, este foarte ușor să implementați analiza PHP a unui document HTML folosind biblioteca simplă HTML DOM. În principiu, totul din această bucată de cod PHP poate fi înțeles intuitiv, dar dacă aveți îndoieli, ne vom uita la cod.

Linia 2-4: conectăm biblioteca, creăm un obiect de clasă și încărcăm cod HTML dintr-un șir.

Linia 7: Folosind această linie, găsim totul

etichete în codul HTML și stocate într-o variabilă ca o matrice. Primul paragraf va avea indicele 0, celelalte paragrafe vor fi indexate 1,2,3...

Linia 10: Obținem conținutul celui de-al doilea paragraf din colecția noastră. Indicele acestuia va fi 1. De asemenea, facem modificări textului folosind atributul innertext. Atributul innertext modifică tot conținutul din interiorul etichetei specificate. De asemenea, putem schimba eticheta în sine folosind atributul de text extern.

Să adăugăm o altă linie de cod PHP care va atribui o clasă de stil paragrafului nostru.

$element->class = "nume_clasa"; echo $html->salvare();

Rezultatul executării codului nostru va fi următorul document HTML:

Salut Lume!

Suntem aici și suntem aici pentru a rămâne.



Alti selectori

Mai jos sunt alte exemple de selectoare. Dacă ați folosit jQuery, atunci sintaxa din biblioteca simplă html dom este oarecum similară.

// obțineți primul element cu id="foo" $single = $html->find("#foo", 0); // la parsare, primește toate elementele cu clasa class="foo" $collection = $html->find(".foo"); // primește toate etichetele la analizarea unui document html $collection = $html->find("a"); // primește toate etichetele , care sunt plasate în etichetă

$colecție = $html->find("h1 a"); // primește toate imaginile cu title="himom" $collection = $html->find("img"); !}

Utilizarea primului selector atunci când php analizează un document html este foarte simplă și de înțeles. Unicitatea sa este că returnează un singur element html, spre deosebire de altele care returnează o matrice (colecție). Cu al doilea parametru (0), indicăm că avem nevoie doar de primul element al colecției noastre. Sper că înțelegeți toate opțiunile pentru selectoare din biblioteca simplă HTML DOM; dacă nu înțelegeți ceva, încercați metoda experimentului științific. Chiar dacă nu a ajutat, vă rugăm să comentați articolul.

Documentație simplă a bibliotecii HTML DOM

Puteți găsi documentația completă despre utilizarea bibliotecii simple HTML DOM la această adresă:

http://simplehtmldom.sourceforge.net/manual.htm

Vă voi oferi doar o ilustrare care arată posibilele proprietăți ale unui element DOM HTML selectat.


Pasul 3 – Exemplu real de analiză PHP a unui document HTML

Pentru un exemplu de analizare și punere în acțiune a bibliotecii HTML DOM, vom scrie un dispozitiv de prindere a materialelor pe un site web. În continuare, vom afișa toate articolele sub forma unei liste, care va indica numele articolelor. Când scrieți grabbers, amintiți-vă că furtul de conținut este pedepsit prin lege! Dar nu atunci când pagina conține un link activ către documentul sursă.


Include("simple_html_dom.php"); $articole = array(); getArticles("http://site/");

Începem prin a conecta biblioteca și a apela funcția getArticles, care va analiza documentele HTML în funcție de adresa paginii care este transmisă ca parametru de funcție.

De asemenea, indicăm o matrice globală în care vor fi stocate toate informațiile despre articole. Înainte de a începe să analizăm un document HTML, să vedem cum arată.

Acesta este șablonul de bază pentru această pagină. Când scrieți un parser html, trebuie să examinați cu atenție documentul, precum și comentarii precum, acestia sunt si descendenti. Cu alte cuvinte, în ochii simplei biblioteci HTML DOM, acestea sunt elemente care sunt echivalente cu alte etichete de pe pagină.

Pasul 4 – Scrieți funcția principală PHP HTML parser

funcția getArticles($page) ( global $articole; $html = new simple_html_dom(); $html->load_file($page); // ... mai multe vor veni... )

La începutul funcției, numim matricea noastră globală pe care am specificat-o mai devreme. Creați un nou obiect simple_html_dom. În continuare, încărcăm pagina pe care o vom analiza.

Pasul 5 – Găsiți informațiile de care aveți nevoie

$items = $html->find("div"); foreach($articole ca $nume) ( $articole = matrice($post->children(0)->text simplu); )

În această bucată de cod totul este extrem de simplu, găsim toate div-urile cu class=name_material. În continuare, citim colecția de elemente și selectăm denumirile materialelor. Toate materialele vor fi salvate într-o matrice sub această formă:

$articles = "Numele materialului 1"; $articles = "Numele materialului 2"; ...

Pasul 6 – Ieșiți rezultatul analizei

Pentru început, vom instala câteva stiluri pentru a face ca informațiile afișate pe care le-am primit în timpul parsării să pară frumoase.

Element ( padding:10px; color:#600; font:bold 40px/38px helvetica, verdana, sans-serif; )

"; echo $articol; ecou "

"; } ?>

Rezultatul executării acestui script va fi o listă de titluri de articole pe site.

Concluzie

Așa că am învățat PHP analizând documente html. Amintiți-vă că răzuirea este un proces lung. O pagină poate fi analizată în aproximativ o secundă. Dacă analizați un număr mare de documente HTML, serverul dvs. poate întrerupe scriptul din cauza expirării timpului de execuție alocat. Acest lucru poate fi rezolvat folosind funcția set_time_limit(240); 240 este timpul în secunde alocat pentru executarea scriptului.

Acest articol are scopul de a formula conceptele de bază ale analizei unei pagini HTML folosind PHP. Există și alte biblioteci și metode de analiză. Dacă știți vreunul, împărtășiți-le în comentarii. M-aș bucura să știu ce instrumente și metode de analiză html folosiți.



Webmasterii se confruntă adesea cu această problemă atunci când trebuie să preia anumite informații de pe un site și să le transfere pe altul. Puteți salva mai întâi informațiile pe un mediu intermediar și apoi le puteți încărca în altă parte, dar această abordare nu este întotdeauna convenabilă. În unele cazuri, este mult mai rapid să încărcați un parser pe site-ul însuși care acceptă PHP și să îl rulați de la distanță, astfel încât să analizeze automat informațiile și să le încarce în baza de date a resurselor.
Printre soluțiile gata făcute se numără unele populare, cum ar fi Content Downloader și ZennoPoster; desigur, sunt foarte convenabile și ușor de înțeles pentru oricine, chiar și pentru cei care nu sunt familiarizați cu programarea, dar au unele dezavantaje. De exemplu, sunt plătiți și nu au suficientă flexibilitate care să poată fi injectate într-un script PHP obișnuit. Mai mult, dezvoltarea unui parser complex folosindu-le nu este în niciun fel inferioară în timp scrierea unui analog în PHP.
Există, de asemenea, un lucru gratuit precum iMacros - un limbaj de scripting care poate emula acțiunile utilizatorului în browser, dar nici această abordare nu funcționează cel mai bine peste tot.

Mulți oameni cred că programarea și, cu atât mai mult, scrierea parserelor este o sarcină foarte dificilă. De fapt, php este una dintre cele mai simple limbi care pot fi învățate la un nivel suficient în câteva săptămâni sau o lună.
Parserii sunt, de asemenea, ușor de scris, motiv pentru care programatorii începători le scriu pentru a stăpâni limbajul.
Primul lucru care îi vine în minte unei persoane care decide să scrie un astfel de script este că trebuie să folosească funcții pentru a lucra cu șiruri de caractere (strpos, substr și similare) sau expresii regulate. Acest lucru este absolut adevărat, dar există o avertizare. Dacă trebuie să scrieți o mulțime de parseri, va trebui să vă dezvoltați propria bibliotecă pentru a nu rescrie aceleași construcții de o sută de ori, dar acest lucru va dura o tonă de timp și, având în vedere că biblioteci similare există deja, un astfel de exercițiu se dovedește a fi complet inutil.
O opțiune ideală pentru un începător ar fi să studieze biblioteca PHP Simple HTML DOM Parser. După cum puteți ghici din nume, este foarte ușor de învățat. Să ne uităm la codul de bază:

$html = file_get_html ("http://www.yandex.ru");
$a_links = $html->find("a");

Prima linie creează un obiect pagină, a cărui sursă în acest caz este Yandex și îl scrie în variabila $html, care are mai multe funcții, de exemplu find. Find - caută un element după un anumit parametru, de exemplu find ('a') - va returna o matrice cu toate linkurile de pe pagină. Find(‘#myid’) – va returna o matrice de elemente al căror id este egal cu „myid”.
Parametrul href al primului link disponibil este accesat astfel:

Echo $a_links[ 0 ]->href;

Mai multe detalii gasiti pe site:
simplehtmldom.sourceforge.net

Biblioteca, așa cum am menționat mai sus, este foarte simplă și este cea mai potrivită pentru un programator începător, plus că funcționează destul de repede și nu este foarte solicitantă pentru resursele serverului.
Această bibliotecă are un dezavantaj - nu toate paginile sunt potrivite pentru ea. Dacă un element nu este afișat, dar știți sigur că este acolo, este mai bine să utilizați biblioteca DOM (Document Object Model). Este bun în orice, cu excepția vitezei de dezvoltare și a clarității.

$doc = nou DOMDocument();
$doc->loadHTML($date);
$searchNodes = $doc->getElementsByTagName("a");
echo $searchNodes[ 0 ]->getAttribute("href");

Acest script creează mai întâi un obiect de tip DOM, iar variabila $data ar trebui să conțină codul paginii. Apoi găsește toate etichetele (link-urile) folosind apelul $doc->getElementsByTagName, apoi le scrie în matricea $searchNodes. Parametrul href al primului link de pe pagină este accesat apelând $searchNodes[ 0 ]->getAttribute("href").
Drept urmare, scriptul se dovedește a fi mai greoi, iar scrierea lui nu mai este atât de convenabilă, dar uneori trebuie să utilizați această bibliotecă specială.

Etichete: php, parser, programare

Aproape de rector 20 octombrie 2013 la 17:33

Parserul PHP este ușor

  • PHP
  • Programare

Webmasterii se confruntă adesea cu această problemă atunci când trebuie să preia anumite informații de pe un site și să le transfere pe altul. Puteți salva mai întâi informațiile pe un mediu intermediar și apoi le puteți încărca în altă parte, dar această abordare nu este întotdeauna convenabilă. În unele cazuri, este mult mai rapid să încărcați un parser pe site-ul însuși care acceptă PHP și să îl rulați de la distanță, astfel încât să analizeze automat informațiile și să le încarce în baza de date a resurselor.
Printre soluțiile gata făcute se numără unele populare, cum ar fi Content Downloader și ZennoPoster; desigur, sunt foarte convenabile și ușor de înțeles pentru oricine, chiar și pentru cei care nu sunt familiarizați cu programarea, dar au unele dezavantaje. De exemplu, sunt plătiți și nu au suficientă flexibilitate care să poată fi injectate într-un script PHP obișnuit. Mai mult, dezvoltarea unui parser complex folosindu-le nu este în niciun fel inferioară în timp scrierea unui analog în PHP.
Există, de asemenea, un lucru gratuit precum iMacros - un limbaj de scripting care poate emula acțiunile utilizatorului în browser, dar nici această abordare nu funcționează cel mai bine peste tot.

Mulți oameni cred că programarea și, cu atât mai mult, scrierea parserelor este o sarcină foarte dificilă. De fapt, php este una dintre cele mai simple limbi care pot fi învățate la un nivel suficient în câteva săptămâni sau o lună.
Parserii sunt, de asemenea, ușor de scris, motiv pentru care programatorii începători le scriu pentru a stăpâni limbajul.
Primul lucru care îi vine în minte unei persoane care decide să scrie un astfel de script este că trebuie să folosească funcții pentru a lucra cu șiruri de caractere (strpos, substr și similare) sau expresii regulate. Acest lucru este absolut adevărat, dar există o avertizare. Dacă trebuie să scrieți o mulțime de parseri, va trebui să vă dezvoltați propria bibliotecă pentru a nu rescrie aceleași construcții de o sută de ori, dar acest lucru va dura o tonă de timp și, având în vedere că biblioteci similare există deja, un astfel de exercițiu se dovedește a fi complet inutil.
O opțiune ideală pentru un începător ar fi să studieze biblioteca PHP Simple HTML DOM Parser. După cum puteți ghici din nume, este foarte ușor de învățat. Să ne uităm la codul de bază:

$html = file_get_html ("http://www.yandex.ru");
$a_links = $html->find("a");

Prima linie creează un obiect pagină, a cărui sursă în acest caz este Yandex și îl scrie în variabila $html, care are mai multe funcții, de exemplu find. Find - caută un element după un anumit parametru, de exemplu find ('a') - va returna o matrice cu toate linkurile de pe pagină. Find(‘#myid’) – va returna o matrice de elemente al căror id este egal cu „myid”.
Parametrul href al primului link disponibil este accesat astfel:

Echo $a_links[ 0 ]->href;

Mai multe detalii gasiti pe site:
simplehtmldom.sourceforge.net

Biblioteca, așa cum am menționat mai sus, este foarte simplă și este cea mai potrivită pentru un programator începător, plus că funcționează destul de repede și nu este foarte solicitantă pentru resursele serverului.
Această bibliotecă are un dezavantaj - nu toate paginile sunt potrivite pentru ea. Dacă un element nu este afișat, dar știți sigur că este acolo, este mai bine să utilizați biblioteca DOM (Document Object Model). Este bun în orice, cu excepția vitezei de dezvoltare și a clarității.

$doc = nou DOMDocument();
$doc->loadHTML($date);
$searchNodes = $doc->getElementsByTagName("a");
echo $searchNodes[ 0 ]->getAttribute("href");

Acest script creează mai întâi un obiect de tip DOM, iar variabila $data ar trebui să conțină codul paginii. Apoi găsește toate etichetele (link-urile) folosind apelul $doc->getElementsByTagName, apoi le scrie în matricea $searchNodes. Parametrul href al primului link de pe pagină este accesat apelând $searchNodes[ 0 ]->getAttribute("href").
Drept urmare, scriptul se dovedește a fi mai greoi, iar scrierea lui nu mai este atât de convenabilă, dar uneori trebuie să utilizați această bibliotecă specială.

Etichete: php, parser, programare