HTML DOM Parser
A legutóbbi példában bemutattam, hogy hogyan hozhatunk létre PHP kód segítségével egy új HTML DOM szerkezetet, majd menthetjük le azt egy .html fájlba. Ezúttal megfordítom a feladatot és ezúttal ezt a kapott fájlunkat fogjuk feldarabolni. Erre a feladatra létezik egyébként egy nagyon hasznos osztály is a Simple HTML DOM. Ezt a kész osztályt lényegesen kényelmesebb és könnyebb használni, mint a most elkészülő forráskódot, ellenben érdemes tudni, hogy a most bemutatni kívánt kód ennek az osztálynak is alapja.
Első körben töltsük be a feldarabolni kívánt forrás fájl-t. Ez megtörténhet lokális eléréssel, vagy akár távoli eléréssel is, egy URL segítségével. Itt ügyelünk arra, hogy az úgynevezett White Space, vagy más nevén felesleges szóközök ne szerepeljenek a betöltésben.
PHP
$html = file_get_contents('source.html');
$dom = new domDocument('1.0', 'utf-8');
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
Ezt követően pedig a beolvasott dokumentumban megkeresünk minden olyan DOM elemet, aminek a neve "table".
PHP
$tables = $dom->getElementsByTagName('table');
Mivel több táblázat is szerepelhet a dokumentumban, így a találatokat egy tömb formájában kapjuk meg. Amennyiben egy konkrét táblázatot szeretnénk csak megkeresni és nem érdekel minket a többi, akkor hivatkozhatunk "ID"-ra is. Osztályra sajnos nincs módunk keresni, ellenben ezt a hiányosságot pótolták a fejlesztők a Simple HTML DOM esetén. A kezeléséről a fejlesztő oldalán lehet bővebben olvasni.
PHP
$dom->getElementById('tablazat_id');
Ezt követően nincs más dolgunk, mint bejárni a "$tables" tömbünket és újra végrehajtani a keresést, amivel a benne lévő cellákat tudjuk majd kilistázni.
PHP
foreach ($tables as $table)
{
$table_id = $table->getAttribute('id');
$result_text .= 'Table id: '.$table_id.'<hr />';
$rows = $table->getElementsByTagName('tr');
$r = 1;
foreach ($rows as $row)
{
echo $r.' sor<br />';
$c = 1;
$cols = $row->getElementsByTagName('td');
foreach ($cols as $col)
{
echo $c.' oszlop értéke: '.$col->nodeValue.'<br />';
$c++;
}
echo '<hr />';
$r++;
}
}
Az előző bejegyzésben már megismerkedtünk a "setAttribute" függvénnyel, ami egy adott DOM elemhez társít attribútumot, a "getAttribute", pedig ennek a lekérdezéséért felelős megfelelője.
Mire tudom majd ezt felhasználni?
Elég sok felhasználási területe van a DOM parsereknek. Többek között ennek a blognak a file cache megoldása is ezzel van megvalósítva. 12 óránként beolvassa a weboldal adott oldalának teljes forráskódját, majd lementi egy .cache fájlba és 12 órán keresztül ezt a fájlt fogja beolvasni a szerver, ahelyett, hogy újra és újra elvégezné az adatbázis lekérdezéseket. Ezzel jelentősen lehet tehermentesíteni a szervert. A megvalósítás pontos részleteivel majd egy későbbi bejegyzésben fogok írni.
Ezen kívül felhasználhatjuk akár más weboldalak feltérképezésére is. Ha van egy weboldalon egy folyamatosan frissülő táblázat, vagy egy kiírás, amit szeretnék bizonyos időközönként megfigyelni, akkor arra a célra is remekül alkalmazható. Persze komolyabb botok megírásához ennél több tapasztalatra és tudásra van szükség, de egyszerűbb elkészítéséhez jó alap lehet.
Leírásaink azon kezdő és haladó programozóknak nyújtanak segítséget, akik már minimális szinten foglalkoztak weboldalkészítéssel. Ha szeretnél jobban elmélyülni a témában, vagy elsajátítani alapokat, még tovább fejlődni, akkor nézz körbe tanfolyam kínálatunkban, ahol a kezdőtől a profi szintig nyújtunk képzéseket a számodra.