Listing 1. aggregator.py
#!/usr/bin/python
import feedparser
import sys
# ---------------------------------------------------
# Open the personal feeds output file
aggregation_filename = "myfeeds.html"
max_title_chars = 60
try:
    aggregation_file = open(aggregation_filename,"w")
    aggregation_file.write("""
My news
""")
except IOError:
    print "Error: cannot write '%s' " % \
    aggregation_filename
    exit
# ---------------------------------------------------
# Each non-blank line in feeds.txt is a feed source.
feeds_filename = "feeds.txt"
feeds_list = []
try:
    feeds_file = open(feeds_filename, 'r')
    for line in feeds_file:
        stripped_line = line.strip().rstrip()
        if len(stripped_line) > 0:
            feeds_list.append(stripped_line)
            sys.stderr.write("Adding feed '" + \
            stripped_line + "'\n")
    feeds_file.close()
except IOError:
    print "Error: cannot read '%s' " % feeds_filename
    exit
# ---------------------------------------------------
# Iterate over feeds_list, grabbing the feed for each
for feed_url in feeds_list:
    sys.stderr.write("Checking '%s'..." % feed_url)
    feed = feedparser.parse(feed_url)
    sys.stderr.write("done.\n")
    aggregation_file.write('%s
\n' % \
                           feed.entries[0].title)
    # Iterate over each entry from this feed,
    # displaying it and putting it in the summary
    for entry in feed.entries:
        sys.stderr.write("\tWrote: '%s'" % \
                      entry.title[0:max_title_chars])
        if len(entry.title) > max_title_chars:
            sys.stderr.write("...")
        sys.stderr.write("\n")
        aggregation_file.write(
           '%s\n' %
           (entry.link, entry.title))
    aggregation_file.write('\n')
# ---------------------------------------------------
# Finish up with the HTML
aggregation_file.write("""
""")
aggregation_file.close()