TechLife devBlog

Python i jQuery czyli pyquery

Internet 4th May 2009

Ostatnio wpadł mi w ręce bardzo ciekawy moduł Pythona, który śmiało można określić jako jQuery po stronie serwera. Jeżeli potrzebowaliście kiedyś wyciągnąć jakieś dane z kodu HTML-a i denerwowała was zabawa z parsowaniem kodu za pomocą sgmllib czy innego tego typu wynalazku, to wasze cierpienia właśnie się skończyły.

Jak to działa?

Na początek pobierzemy zawartość jakieś strony, z której chcemy wyciągnąć dane. Ja posłużę się stroną antyweb.pl, ponieważ jest całkiem przystępnie zakodowana.

from pyquery import PyQuery as pq
import urllib

html = urllib.urlopen("http://antyweb.pl").read()
html = pq(html)

Teraz wystarczy już zadecydować co chcemy wyciągnąć i po prostu to zrobić :-) Np. informacje o autorze

print  html("#f li.frt").text()

Wynik:

Witaj, nazywam sie Grzegorz Marczak i jestem autorem tego bloga. Piszę tutaj o serwisach spolecznosciowych, nowych technologiach i nowych trendach w internecie.

Wyciągnięcie wszystkich kategorii

for a in html("li.categories a"):
    print a.text

Wynik:

antytydzień Biała flaga
Ciekawe strony
google
Świat
Miniblog
Mobilnie
Moje przemyślenia
Off topic
polska
Pytamy.pl
Startups
To mnie drażni.
Uncategorized
W trakcie tworzenia
wywiady

Wyszukanie najczęściej komentowanego wpisu ze strony głównej

max_comments = 0
title = ''
for a in html("ul.clnn li.l a"):
    try:
        # liczba komentarzy
        comments = int(a.text.split(" ")[1])
        if max_comments < comments:
            max_comments = comments
            # nazwa wpisu
            title = a.values()[1].replace("Komentarze do wpisu ",'')
    except:
        pass

print "Najwiecej komentarzy: %s" % max_comments
print "Wpis: %s" % title

Wynik:

Najwiecej komentarzy: 32
Wpis: Interia mówi, tak kupujemy ruch (bo inni też tak robią)

Więcej

To oczywiście tylko mała próbka możliwości. pyquery pozwala również na manipulację stylami (addClass, toggleClass, removeClass, attr, css) czy samą strukturą danych (append, prepend, prependTo, insertAfter, remove, replaceWith itd.). Jeżeli posiadamy moduł WebOb możemy też zaprzęgnąć do pracy Ajax.

Po więcej informacji zapraszam na stronę projektu pyquery.

Komentarze z jogger.pl

D4rky 04.05.2009 / 16:24

Genialne, dzięki :)

jackweb 04.05.2009 / 16:27

Świetne!

radmen 04.05.2009 / 16:44

Hmm składnia jest podobna do PHPowej biblioteki PHPQuery – tam również jest funkcja ‘pq’ no i działanie takie samo :P

chester 04.05.2009 / 16:45

świetne!

Paweł Ciupak 04.05.2009 / 16:47

Pf. Python ma takie coś już od dawna i nazywa się to „xml.dom”. Choć nie, zapomniałem że to nie działa z modną obecnie tagzupą (a.k.a. HTML5).

trójkąt 04.05.2009 / 16:52

@Paweł: raczej trudno porównywać wygodę użycia pyquery z xml.dom ;-)

Krzysztof 04.05.2009 / 16:56

Dzięki, na pewno się to przyda.

pecet 04.05.2009 / 17:01

HTML5 obecnie modny? Jakoś nie widziałem nigdzie chyba go.

Paweł Ciupak 04.05.2009 / 17:01

A ja widziałem. Np. mój joggasek jest zgodny jedynie z HTML5, a niezgodny z czym innym ;>.

pim 04.05.2009 / 17:30

Fajowskie ;) Dzięki!

mrk 05.05.2009 / 00:24

A wiesz może czego wewnętrznie używa do parsowania HTML’a ? Jakiś własny parser czy coś gotowego? Pytam, bo problemy zaczynają się z rzeczywistymi stronami nie do końca zgodnymi ze standardami – minimalny błąd na stronie potrafi wywalić parser i nici z przetwarzania… Ostatnio używałem do parsowania HTML BeautifulSoup i też musiałem dodać trochę kodu do czyszczenia wejściowego html’a (problemem był najczęściej źle osadzony JavaScript)

mrk 05.05.2009 / 00:32

Odpowiem sobie sam – na wejściu musi być poprawny xml niestety, co dość mocno ogranicza zastosowania praktyczne :( Fakt, można dać na wejściu html po przemieleniu przez BeautifulSoup na przykład, ale to jest mało optymalne wydajnościowo (dwukrotne parsowanie), poza tym z samego BS też w miarę wygodnie się korzysta…

ejb 12.05.2009 / 23:40

dzięki bardzo! Super sprawa.

szurpit 12.07.2009 / 10:53

wyskakuja bledy ze nie mozna zaladowac modulu
chociaz mam go ; d

Hubert 26.09.2009 / 14:55

ufff ;-) a już miałem walczyć z sgmllib ;-)



Komentarze