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
Ś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
Genialne, dzięki :)
Świetne!
Hmm składnia jest podobna do PHPowej biblioteki PHPQuery – tam również jest funkcja ‘pq’ no i działanie takie samo :P
świetne!
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).
@Paweł: raczej trudno porównywać wygodę użycia pyquery z xml.dom ;-)
Dzięki, na pewno się to przyda.
HTML5 obecnie modny? Jakoś nie widziałem nigdzie chyba go.
A ja widziałem. Np. mój joggasek jest zgodny jedynie z HTML5, a niezgodny z czym innym ;>.
Fajowskie ;) Dzięki!
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)
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…
dzięki bardzo! Super sprawa.
wyskakuja bledy ze nie mozna zaladowac modulu
chociaz mam go ; d
ufff ;-) a już miałem walczyć z sgmllib ;-)