PHP Simple HTML DOM Parser: jak jednoduše zpracovat HTML v PHP

Ze světa JavaScriptu určitě znáte knihovnu jQuery, která, mimo jiné, umožňuje velmi jednoduše přistupovat k určitým prvkům ve struktuře stránky HTML. V PHP nic tak pohodlného standardně není - tedy dokud nevyužijete bezplatný PHP Simple HTML DOM Parser.

Reklama

K čemu vůbec používat nějaký HTML parser v PHP? Představte si situaci, kdy na své webové stránce potřebujete zpracovat data z jiného webu, z jiné adresy. Jako zdroj dat budete mít pouze HTML strukturu, pro její zpracování budete moci použít jazyk PHP.

Z obdržené HTML struktury budete chtít vypreparovat například nějaký DIV či jiný prvek s určitým ID nebo s nějakou třídou. Zároveň potřebujete zajistit, abyste obdrželi jen takový prvek s požadovanou třídou, který je zanořen v určité struktuře.

Pokud byste něco takového dělali s pomocí JavaScriptu a jQuery, bylo by to velmi jednoduché, stačilo by napsat $(‘selector’) a hned byste obdrželi požadovaný prvek. Pro příklad:

$(‘#obsah div.teloobsahu’).val(‘<p>Tady je nové HTML pro <strong>tělo obsahu</strong></p>’);

Výše uvedený kód v jQuery zajistí, že DIV se třídou teloobsahu zanořený v elementu s ID obsah obdrží nový HTML kód. Z původního

<div id=”obsah”><div class=”teloobsahu”>tady je původní obsah</div></div>

tak v prohlížeči po spuštění uvedeného kódu v jQuery vznikne následující:

<div id=”obsah”><div class=”teloobsahu”><p>Tady je nové HTML pro <strong>tělo obsahu</strong></p></div></div>

Proč použít PHP?

Uvedené řešení v jQuery se snadno zapisuje, ale ne vždy vám bude vyhovovat. V různých situacích potřebujete zpracovat data již na straně serveru a do prohlížeče uživateli odeslat již hotové HTML. Třeba ve zmíněném případě, kdy má skript stáhnout HTML kód z jiné webové stránky, vypreparovat z něj určitý prvek a ten vložit do vaší HTML struktury.

V PHP byste hledání prvků v HTML struktuře mohli řešit použitím různých regulárních výrazů a funkce preg_match(). Přiznám se, že sestrojování regulárních výrazů absolutně nesnáším. Kde je to nezbytné, sahám po prográmku RegexBuddy.

Nedávno jsem ale objevil povedený PHP Simple HTML DOM Parser. S jeho pomocí lze ke struktuře HTML kódu přistupovat podobně, jako s využitím jQuery. Jen to budete mít v PHP.

Jak pracovat s PHP Simple HTML DOM Parserem?

PHP Simple HTML DOM Parser jen připojíte do svého kódu a můžete začít používat jeho syntaxi pro přístup k HTML struktuře. Koukněme se na příklad, který je uveden na domovských stránkách tohoto nástroje:

$html = file_get_html(‘http://www.google.com/’);
foreach($html->find(‘img’) as $element)
       echo $element->src . ‘<br>’;
foreach($html->find(‘a’) as $element)
       echo $element->href . ‘<br>’;

Pomocí funkce file_get_html() nejprve načtete zdrojový kód ze zadané webové adresy, v tomto případě z Google. Následuje ukázka použití smyčky foreach, ve které je postupně vypisován zdrojový kód všech značek IMG ze získané HTML struktury. Ve druhé smyčce jsou podobně vypsány všechny odkazy.

Výběr prvků se tedy s využitím PHP HTML DOM Parseru realizuje následovně:

$html->find(selektor);

…přičemž selektorem je zápis udávající označení prvků, jejich ID nebo tříd. Takže například:

$ret = $html->find(‘div[id=obsah]’); - vrátí DIV s ID odpovídajícím řetězci obsah
$ret = $html->find(‘div[id]’); - vrátí všechny DIVy s jakýmkoli ID
$ret = $html->find(‘[id]’); - vrátí všechny elementy, které mají nastaveno ID

Místo ID můžete samozřejmě použít class, prvky lze za sebou řadit postupně tak, jak je chcete nalézt zanořené v HTML struktuře, tedy podobně jako v jQuery. Speciálním zápisem můžete říci, že vás zajímá jen Ntý prvek odpovídající hledání:

$poradi = 1;

$ret = $html->find(‘div[class=teloobsahu], $poradí);

Stejně pohodlně můžete s nalezenou větví HTML struktury dále pracovat. Takže pokud byste chtěli změnit její obsah, můžete tak učinit následovně:

$html->find(‘div[class=teloobsahu], 0)->innertext = ‘<p>Tady je nové HTML pro <strong>tělo obsahu</strong></p>;

Takto byste tedy řešili zadání naznačené v jQuery na začátku článku, zde přímo v PHP. Samozřejmě je potřeba počítat s tím, že změny realizujete pouze v proměnné obsahující kompletní HTML strukturu ze získané adresy. Upravený kód nebo jeho části musíte někam vypsat nebo uložit. S tím si ale už poradíte.

Simple HTML DOM Parser toho umí mnohem více, doporučuji kouknout do jeho online dokumentace a především na kompletní výčet jeho API.

Simple HTML DOM Parser a Drupal

Na závěr ještě dobrá zpráva pro Drupalisty. K dispozici máme modul nazvaný simplehtmldom API, který zmíněný parser do Drupalu doplňuje. Modul stačí tedy zapnout a ihned můžete ve svém kódu (tedy ve vlastních modulech nebo PHP obsahu/blocích) s parserem pracovat, není třeba nějaké další includování.

Zde je jednoduchá ukázka, která stáhne kód ze zadané adresy, vypreparuje z něj určitý element a takto získaným HTML nahradí obsah DIVu s konkrétním ID v určitém uzlu. Následně upravenou podobu uzlu uloží. Upozorňuji, že v následujícím kódu kvůli srozumitelnosti není žádné ošetření vstupů, takže může být potenciálně nebezpečný:

  $html = file_get_html(‘http://nejakaadresa.cz/stranka.php’);

  $tabulka = $html->find(‘div[class=telostranky] table’ , 0);

  $node = node_load($cislouzlu);

  $nodehtml = str_get_html($node->body[‘cs’][0][‘value’]);

  $nodehtml->find(‘div[id=tabulkovadata]’ , 0)->innertext = $tabulka;

  $newhtml = $nodehtml->save();

  $node->body[‘cs’][0][‘value’] = $newhtml;

  node_save($node);

  $nodehtml->clear();

  unset($nodehtml);

Tagy: 

Reklama

Komentáře

no problém je že treba vubec nikde v manualu se nepise nic o jeho instalaci a o tom kam vlozit include atd... napriklad pokud ho vlozim do souboru function ve wordpressu, nic se neukaze a hodi to chybu 500... proste zase jenom pro profiky a nic pro normální lidi: include_once('simple_html_dom.php'); = error 500 , docela rad bych si s tím pohrál ale zatím to na to moc nevidim...

No jo, vývojářská věc to je. Čili nic pro klikače. Pokud byste to chtěl zkoušet v Drupalu, je na to modul. Zda je přímo plugin pro WordPress, to nevím, ale asi bych začal tím, že pro něj udělám speciální pluginek, kde to napojím. A nebudu to rvát do šablony, ne?

Tvořím weby. Nabízím poradenství pro Drupal. Jsem na Twitteru.

Přidat komentář