[ BigBrother2005 @ 20.09.2005. 02:15 ] @
Code:

import feedparser
def hranilica(rss):
    kanal = feedparser.parse(rss)
    #print kanal.feed.link
    unos_br=0
    print "-----------------"
    print kanal.feed.title
    print "-----------------"
    for i in range (10):
        try:
            print kanal.entries[unos_br].title
            unos_br=unos_br+1
        except:
            print "nema vishe unosa"

for z in range (150):
    rss="http://www.elitesecurity.org/forum/"+str(z)+"/backend.xml"
    try:
        hranilica(rss)
    except:
        print "--------------------------"
        print "RSS kanal nije validan"
        print "--------------------------"

Ukoliko uspesno izvrsite ovaj kod trebalo bi da vam izlista sve feedove Elitesecurity-ja

Ovaj primer koristi biblioteku feedparser koju mozete skinuti sa: http://sourceforge.net/projects/feedparser/

Dokumentacija za ovaj modul se nalazi na:
http://feedparser.org/docs/

[ Ernest_Che @ 02.12.2008. 16:21 ] @
Nije los
[ alex @ 11.12.2008. 09:59 ] @
Autor feedparser-a je drugar Mark Pilgrim, koji je pre vise od godinu ipo dana prebacio svoj kôd sa Sourceforge servera na Google Code. Najnoviju verziju feedparsera mozete naci ovde...

Za one koji koriste setuptools dovoljno je u konzoli ukucati:

easy_install -U feedparser
[ alex @ 11.12.2008. 11:33 ] @
Tek sad pogledah kôd i primetih koliko u stvari nije pythonic.

Pre svega, ta varijabla unos_br je skroz nepotrebna, jer kanal.entries je list tip podatka, koji podrzava iteratore, tako da je dovoljno upotrebiti konstrukciju:
for entry in kanal.entries:
cime ces u petlji imati raspolozivu varijably entry, a takodje nema potrebe za hvatanjem izuzetaka (sa try/catch) jer koristeci iterator nije moguce dobiti izuzetak u tom kontekstu. S druge strane, izuzetak koji bi trebalo da se hvata i resi je UnicodeEncodeError, jer prosto stampanje naslova ce da prijavi taj izuzetak.

Evo modifikovane hranilica() funkcije:
Code:

def hranilica(rss):
    kanal = feedparser.parse(rss)
    print "-" * 20
    print "%s [%d]" % (kanal.feed.title.encode("utf-8"), len(kanal.entries))
    print "-" * 20
    for entry in kanal.entries:
        print entry.title.encode("utf-8")


Ukoliko zelis samo 10 unosa iz kanal.entries, modifikuj for petlju da iz liste izvuce potreban deo (tzv. list slicing), i to ovako:
for entry in kanal.entries[:10].

Ne mogu da se setim da li u RSS feed-ovima na ES-u postoji feed koji vraca listu foruma, jer ako postoji onda se for petlja u kojoj pozivas funkciju hranilica moze dodatno prepraviti.

Mada, ukoliko zelis da ti kôd bude bas napredan python, onda tu for petlju mozes zameniti prostijom konstrukcijom, koristeci map() funkciju i tzv. list comprehensions:
Code:

rss = "http://www.elitesecurity.org/forum/%d/backend.xml"
map(hranilica, [rss % x for x in range(150)])


Eto, sad je kôd pythonic, i izgleda ovako:
Code:

def hranilica(rss):
    kanal = feedparser.parse(rss)
    print "-" * 20
    print "%s [%d]" % (kanal.feed.title.encode("utf-8"), len(kanal.entries))
    print "-" * 20
    for entry in kanal.entries[:10]:
        print entry.title.encode("utf-8")

if __name__ == '__main__':
    rss = "http://www.elitesecurity.org/forum/%d/backend.xml"
    map(hranilica, [rss % x for x in range(150)])


Toliko od mene :)
[ Au197/79 @ 11.12.2008. 12:02 ] @
A neLISP Python programer bi poslednju liniju napisao kao:
Code:
[hranilica(rss % x) for x in range(150)]


[ alex @ 11.12.2008. 13:11 ] @
Hehe, naravno da moze , cak je i brze jer se lista jednom kreira, ali nisam hteo da plasim publiku