phpQuery – parser HTML z api jQuery

Ostatnio coś mnie drgnęło, aby sprawdzić czy są jakieś nowości w php dotyczące parsowania plików html. Ku mojemu pozytywnemu zaskoczeniu znalazłem pewną bibliotekę, która jest dość dynamicznie rozwijana. Posiada API z jQuery, dzięki czemu używanie jej jest bezbolesne dla tych którzy znają ten framework js. Otóż jest to phpQuery :).

Ale co to jest?

Jakiś czas temu na blogu porównałem parsery php i python. Okazało się, że php jest do tych celów kiepski. I od tamtej pory co jakiś czas sprawdzałem czy nic nowego w tym temacie się nie pojawiło. Znalazłem bibliotekę phpQuery, opis jej pojawił się 29 lipca w dokumentacji php http://pl2.php.net/dom

Nazwa oczywiście pochodzi od jQuery, oznacza to że te dwie biblioteki mają coś wspólnego – mianowicie API. Tak, teraz możemy poruszczać się po dokumencie w php tak jak to było w jQuery. Aktualnie brakuje paru fajnych rzeczy, np.: selektorów “:fisrt”, “:last” itp.

Jak to działa?

Działa prawie jak jQuery tylko zamiast “$” używa się “pq” :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// just one file to include
require('phpQuery/phpQuery.php');

// intialize new DOM from markup
phpQuery::newDocument('<div>mydiv<ul><li>1</li><li>2</li><li>3</li></ul></div>')
    ->find('ul > li')
        ->addClass('my-new-class')
        ->filter(':last')
            ->addClass('last-li');

// query all unordered lists in last used DOM
pq('ul')->insertAfter('div');

// iterate all LIs from last used DOM
foreach(pq('li') as $li) {
    // iteration returns plain DOM nodes, not phpQuery objects
    pq($li)->addClass('my-second-new-class');
}

// same as pq('anything')->htmlOuter() but on document root (returns doctype etc)
print phpQuery::getDocument();
?>

Uwaga!

Ładując dane do phpQuery, oznacza pakowanie ich w “DOMDocument class”. Tutaj jest jedno zastrzeżenie. Czasem na stronach specjalne znaki są wypisywanie kodami html co powoduje, że później podczas parsowania danych pojawiają się krzaki a nie polskie literki. Jest na to sposób, należy użyć funkcji mb_convert_encoding :)

1
2
3
4
5
6
7
8
<?php
require('phpQuery/phpQuery.php');
$htmlCode = file_get_contents('http://example.com');
$htmlCode= mb_convert_encoding($htmlCode, 'HTML-ENTITIES', "UTF-8");
// intialize new DOM from markup
phpQuery::newDocument($htmlCode);
//......
?>

Podsumowanie

Po zastosowaniu tej metody w projekcie uważam, że jest ona genialna :). Autorem jest Polak Tobiasz Cudnik :). Z dokumentacji dostępnej na googleCode można wywnioskować, że phpQuery powstaje od jakiegoś roku, i ciągle się rozwija (25 sierpnia pojawiła się kolejna wersja), co jest bardzo dobrą wiadomością. Polecam więc używanie tej metody bo jak narazie nie zauważyłem niedogodności związanych z użytkowaniem.

Linki

 

Tagi: , ,

Napisz komentarz