from __future__ import with_statement __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' from calibre.web.feeds.news import BasicNewsRecipe class ChicagoTribune(BasicNewsRecipe): title = 'Chicago Tribune' __author__ = 'Kovid Goyal, Sujata Raman and a.peter' description = 'Politics, local and business news from Chicago' language = 'en' version = 2 use_embedded_content = False no_stylesheets = True remove_javascript = True recursions = 1 keep_only_tags = [dict(name='div', attrs={'class':["story","entry-asset asset hentry"]}), dict(name='div', attrs={'id':["pagebody","story","maincontentcontainer"]}), ] remove_tags_after = [{'class':['photo_article',]}] remove_empty_feeds = True match_regexps = [r'page=[0-9]+'] remove_tags = [ {'id':["moduleArticleTools","content-bottom","rail","articleRelates module","toolSet", "relatedrailcontent","div-wrapper","beta","atp-comments","footer",'gallery-subcontent','subFooter']}, {'class':["clearfix","relatedTitle","articleRelates module", "asset-footer","tools","comments","featurePromo","featurePromo fp-topjobs brownBackground", 'ndn_embed', "clearfix fullSpan brownBackground","curvedContent",'nextgen-share-tools','outbrainTools', 'google-ad-story-bottom']}, dict(name='font',attrs={'id':["cr-other-headlines"]})] extra_css = ''' h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;} p{font-family:Arial,Helvetica,sans-serif;font-size:small;} .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center} .story{font-family:Arial,Helvetica,sans-serif;font-size:small;} .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;} .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;} .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;} .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;} body{font-family:Helvetica,Arial,sans-serif;font-size:small;} ''' feeds = [ ('Latest news', 'http://feeds.chicagotribune.com/chicagotribune/news/'), ('Local news', 'http://feeds.chicagotribune.com/chicagotribune/news/local/'), ('Nation/world', 'http://feeds.chicagotribune.com/chicagotribune/news/nationworld/'), ('Hot topics', 'http://feeds.chicagotribune.com/chicagotribune/hottopics/'), ('Most E-mailed stories', 'http://feeds.chicagotribune.com/chicagotribune/email/'), ('Opinion', 'http://feeds.chicagotribune.com/chicagotribune/opinion/'), ('Off Topic', 'http://feeds.chicagotribune.com/chicagotribune/offtopic/'), ('Politics', 'http://feeds.feedburner.com/chicagotribune/cloutstreet/'), #('Special Reports', 'http://feeds.chicagotribune.com/chicagotribune/special/'), #('Religion News', 'http://feeds.chicagotribune.com/chicagotribune/religion/'), ('Business news', 'http://feeds.chicagotribune.com/chicagotribune/business/'), ('Jobs and Careers', 'http://feeds.chicagotribune.com/chicagotribune/career/'), ('Local scene', 'http://feeds.chicagotribune.com/chicagohomes/localscene/'), ('Phil Rosenthal', 'http://feeds.chicagotribune.com/chicagotribune/rosenthal/'), #('Tech Buzz', 'http://feeds.chicagotribune.com/chicagotribune/techbuzz/'), ('Your Money', 'http://feeds.chicagotribune.com/chicagotribune/yourmoney/'), ('Jon Hilkevitch - Getting around', 'http://feeds.chicagotribune.com/chicagotribune/gettingaround/'), ('Jon Yates - What\'s your problem?', 'http://feeds.chicagotribune.com/chicagotribune/problem/'), ('Garisson Keillor', 'http://feeds.chicagotribune.com/chicagotribune/keillor/'), ('Marks Jarvis - On Money', 'http://feeds.chicagotribune.com/chicagotribune/marksjarvisonmoney/'), ('Sports', 'http://feeds.chicagotribune.com/chicagotribune/sports/'), ('Arts and Architecture', 'http://feeds.chicagotribune.com/chicagotribune/arts/'), ('Books', 'http://feeds.chicagotribune.com/chicagotribune/books/'), #('Magazine', 'http://feeds.chicagotribune.com/chicagotribune/magazine/'), ('Movies', 'http://feeds.chicagotribune.com/chicagotribune/movies/'), ('Music', 'http://feeds.chicagotribune.com/chicagotribune/music/'), ('TV', 'http://feeds.chicagotribune.com/chicagotribune/tv/'), ('Hypertext', 'http://feeds.chicagotribune.com/chicagotribune/hypertext/'), ('iPhone Blog', 'http://feeds.feedburner.com/redeye/iphoneblog'), ('Julie\'s Health Club', 'http://feeds.chicagotribune.com/chicagotribune_julieshealthclub/'), ] def get_article_url(self, article): url = BasicNewsRecipe.get_article_url(self, article) url = url.split('/')[-2] encoding = {'0B': '.', '0C': '/', '0A': '0', '0F': '=', '0G': '&', '0D': '?', '0E': '-', '0N': '.com', '0L': 'http://', '0S': 'www.', '0I': '_', '0H': ','} for k, v in encoding.iteritems(): url = url.replace(k, v) return url.partition('?')[0] def skip_ad_pages(self, soup): text = soup.find(text='click here to continue to article') if text: a = text.parent url = a.get('href') if url: return self.index_to_soup(url, raw=True) def postprocess_html(self, soup, first_fetch): # Remove the navigation bar. It was kept until now to be able to follow # the links to further pages. But now we don't need them anymore. for nav in soup.findAll(attrs={'class':['toppaginate','article-nav clearfix']}): nav.extract() for t in soup.findAll(['table', 'tr', 'td']): t.name = 'div' for tag in soup.findAll('form', dict(attrs={'name':["comments_form"]})): tag.extract() for tag in soup.findAll('font', dict(attrs={'id':["cr-other-headlines"]})): tag.extract() return soup