Zadanie napisania pierwszego „naszego” parsera padło na mnie. Nie będę ukrywał, że z początku uznałem to za pewne wyzwanie. Na szczęście dość szybko znalazłem to czego szukałem – czyli BeautifulSoup. Nazwa dość dziwna, ale o tym później. Wystarczyło kilka chwil (czytaj: wieczorów, gdy choć jeden domownik już śpi :) ), żeby przy jej użyciu, prosto i przyjemnie uzyskać to czego się chce. Nie będę tu pisał manual’a, ale pokusiłem się o prosty przykład. Załóżmy, że interesuje nas, kto komentował nasze wpisy ma blogu. Voilà:


#-*- coding: UTF-8 -*-

from BeautifulSoup import BeautifulSoup
import urllib

url = "http://blog.profitto.pl/2008/11/wybor-technologii"
soup = BeautifulSoup(urllib.urlopen(url).read())

authors = set() # unikalność
for comment in soup('div',{'class':'cmtinfo'}):
    authors.add(comment.cite.string)

print ', '.join(authors)

Jeśli jeszcze nie czujesz bluesa, to dodam, że BS poradzi sobie z popsutymi znacznikami i konwersją kodowania. Poza tym mamy do dyspozycji całą moc pythona :) – biblioteki bardzo ułatwiają szybkie rozwiązywanie problemów z przymusem zalogowania się na stronę:


#-*- coding: UTF-8 -*-
# używamy słownika do wypełnienia formularza
from BeautifulSoup import BeautifulSoup
import urllib

url = "http://poczta.profitto.pl"
params =  urllib.urlencode( { 'login':'profitto',
                              'password':'żyrafyWchodząNaSzafy',
                              'hiddenField': 'hidden' } )
soup = BeautifulSoup(urllib.urlopen(url,params).read())
print soup.prettify()

używania tylko najwłaściwszej przeglądarki:


#-*- coding: UTF-8 -*-

from BeautifulSoup import BeautifulSoup
import urllib2

url = "http://www.useragent.org/"
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
opener.addheaders=[ ( 'user-agent','NCSA_Mosaic/2.0' ) ]
soup = BeautifulSoup(opener.open(url))
print soup.prettify()

Żółwiciel opowiada

Na koniec dwa słowa o nazwie biblioteki. Brzmi dość dziwnie, ale jakoś przed zabraniem się za pisanie tego tekstu nie wnikałem skąd się wzięła. Nie powiem, że mnie nie natchnęła (fragment kodu: soup = kitchen.getSoup(url)  :) ). Nie trzeba wiele, by odkryć (mam nadzieje, że nie tylko ja musiałem to odkrywać) – ta nazwa zainspirowana jest utworem Lewis’a Carroll’a Alicja w Krainie Czarów. A dokładnie jest to podmiot liryczny jednej z piosenek - Soup Of The Evening. Zupa na wieczór – niekoniecznie jeden.

Dodatkowa literatura:

Leave a Reply