Mar 11 2009
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 <embed/>. 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 <embed> atrybuty type i src, a później przepisać je do elementu <object> i <param name=”movie”>. Normalnie to byłoby pewnie masa roboty. Jakiś preg_match, preg_replace i inne cuda. Jak my to rozwiązaliśmy? Całkiem łatwo:
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.



