- import httplib
- import xml.etree.ElementTree as ET
- read_items_filename = "read.txt"
- class Error(Exception):
- pass
- class CannotRetrieveUrlError(Error):
- def __init__(self, url):
- self.msg = "Cannot retrieve URL: " + url
- class FeedItem(object):
- def __init__(self,title,description,guid):
- self.title = title
- self.description = description
- self.guid = guid
- class Feed(object):
- def __init__(self, feed_xml):
- self.feed_xml = feed_xml
- self.title, self.desc, self.lang = self.parse_feed_info()
- def print_info(self):
- print "====================="
- print "Feed info:"
- print "Title: " + self.title
- print "Desc: " + self.desc
- print "Lang: " + self.lang
- print "====================="
- print
- def parse_feed_info(self):
- root = ET.fromstring(self.feed_xml)
- channel = root.find('channel')
- title = channel.find('title').text
- description = channel.find('description').text
- language = channel.find('language').text
- return (title, description, language)
- pass
- def items(self):
- tree = ET.fromstring(self.feed_xml)
- channel = tree.find("channel")
- items = channel.getiterator('item')
- for item in items:
- title = item.find('title').text
- description = item.find('description').text
- guid = item.find('guid').text
- yield FeedItem(title,description,guid)
- #z XML dat vrati vsechny itemy, ktere feed obsahuje
- pass
- class Reader(object):
- def __init__(self, url):
- self.read_items_filename = 'rss_read.txt'
- self.url = url
- self.feed = None
- def fetch_feed(self):
- conn = httplib.HTTPConnection(self.url)
- conn.request("GET", "/")
- r = conn.getresponse()
- #print type(r.status), type(r.reason)
- if r.status != 200:
- raise CannotRetrieveUrlError(self.url)
- xml = r.read()
- self.feed = Feed(xml)
- self.feed.print_info()
- conn.close()
- def get_already_read_items(self):
- # ziskat list jiz prectenych itemu ze souboru
- items = []
- f = None
- try:
- f = open(read_items_filename,"rt")
- for line in f:
- item = line.strip()
- items.append(item)
- except IOError, e:
- f = open(read_items_filename,"wt")
- finally:
- if f is not None:
- f.close()
- return items
- def read_feed(self):
- # z feedu precist neprectene itemy
- read_feed = self.get_already_read_items()
- for item in self.feed.items():
- print item.title
- def main():
- url = 'localhost:9000'
- reader = Reader(url)
- try:
- reader.fetch_feed()
- reader.read_feed()
- except CannotRetrieveUrlError, e:
- print e
- if __name__ == '__main__':
- main()