phpQuery – zdzieranie strony po selektorach CSS

Jakiś czas temu odkryłem bardzo ciekawą bibliotekę – phpQuery. Czym ona jest ? Przedewszystkim jest to biblioteka pozwalająca na wyciąganie elementów HTMLa (po stronie PHP), za pomocą selektorów CSS.

Czy to się przydaje? Owszem, nawet bardzo. Przykładowych zastosowań jest wiele. My to wykorzystaliśmy przykładowo do “poprawiania” podczas zapisu embedowanych filmów z YT.  Problem polegał na tym, że w dokumencie xHTML 1.1 Transitional nie można używać elementów . Firefox i Opera sobie z tym radziły, IE natomiast sypał się i krzyczał, że nie może załadować strony.

Jak trzeba było to rozwiązać ? Musieliśmy pobrać z elementu atrybuty type i src, a później przepisać je do elementu i. Normalnie to byłoby pewnie masa roboty. Jakiś preg_match, preg_replace i inne cuda. Jak my to rozwiązaliśmy? Całkiem łatwo:

<?php
$xml = phpQuery::newDocument($data_fields['code']);
phpQuery::selectDocument($xml);

if($xml['object embed']->length() > 0) {
$type = $xml['object embed']->attr('type');
$data_src = $xml['object embed']->attr('src');

$xml['object']->attr('data', $data_src)->attr('type', $type);
$xml['object param[name=movie]']->attr('value', $data_src);
$xml['object embed']->remove();

$data_fields['code'] = $xml->htmlOuter();

}
?>

Wydaje się proste, prawda? Zalet jest wiele, wypunktuję najważniejsze:

  • pobieranie elementów strony za pomocą selektorów CSS
  • manipulowanie tymi elementami (dodawanie klas, stylow)
  • pobieranie atrybutów wybranych elementów.
  • iteracja na wielu elementach
  • możliwość tworzenia nowych elementów, zastępowania starych oraz wyplucie tego wszystkiego jako HTML
  • można nawet stworzyć za jego pomocą całego HTMLa (coś na zasadzie new Element(‘div’))

Jakie dalsze plusy?

  • łatwa obsługa – naprawdę w bardzo łatwy sposób można pobrać dowolny element, oraz modyfikować je. Wystarczy odrobinkę znać składnię jQuery, ale jest to bardzo intuicyjne
  • w szybki sposób można “naprawiać” stronę (chociażby problemy z embedowanymi filmami YT)
  • szybko możemy modyfikować dane, bez używania skomplikowanych regexpów/etc
  • możemy parsować nie tylko HTMLa, praktycznie każdy XML przejdzie

Możliwości tej biblioteki są naprawdę spore. Pamiętajmy jednak, że nie zawsze dobrze jest wystawiać armatę przeciw komarowi. Ze względu na swój rozmiar może się okazać, że lepiej będzie użyć jakiś natywnych klas, które szybciej sobie poradzą z naszym problemem.

Ten wpis umieszczono w kategorii PHP, Programowanie. Możesz dodać go do zakładek permalink. Dodaj komentarz lub dodaj odpowiedź (trackback): Trackback URL.

2 Komentarze

  1. Adam
    Opublikowano 15 October, 2009 at 10:13 | Permalink

    Jak chcesz to w lżejszy sposób zrobić, bez “overhead-a” ciężkiego liba, możesz użyć czystego DOMDocument i XPath. Dopasowanie węzłów HTML-a via XPath ma co prawda trochę inną składnię, ale jest ona dość dobrze wyjaśniona tu: http://plasmasturm.org/log/444/ . Możesz się też pokusić o napisanie prostego konwertera selektorów CSS na XPath. Odkąd zacząłem operować DOMDocument-em do przetwarzania HTML-a powrotu do “tag soup” już nie było. Przetwarzanie HTML-a regexami to ślepa uliczka.

  2. radmen
    Opublikowano 15 October, 2009 at 10:16 | Permalink

    Adam: masz rację. Czasami o wiele lepiej jest korzystać z wymienionych przez Ciebie sposobów. W zasadzie można również skorzystać z SimpleXML.

    Ogólnie to zależy od tego do czego chcesz wykorzystać dany skrypt. Mnie phpQuery przydało się kiedy właśnie chciałem po selektorach łapać elementy. XPath jest jakimś rozwiązaniem, ale na skrypty typu Q&D daje phpQuery daje rade :)

Skomentuj

Twój adres email nie zostanie opublikowany i nie będzie rozpowszechniany. Wymagane pola są oznaczone *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>