import re from calibre.web.feeds.recipes import BasicNewsRecipe class TNR(BasicNewsRecipe): title = 'The New Republic' __author__ = 'Krittika Goyal' description = '''The New Republic is a journal of opinion with an emphasis on politics and domestic and international affairs. It carries feature articles by staff and contributing editors. The second half of each issue is devoted to book and the arts, theater, motion pictures, music and art.''' language = 'en' encoding = 'UTF-8' needs_subscription = True preprocess_regexps = [ (re.compile(r'', re.DOTALL), lambda m: ''), (re.compile(r'', re.DOTALL), lambda m: ''), ] def get_browser(self): br = BasicNewsRecipe.get_browser(self) br.open('http://www.newrepublic.com/user') br.select_form(nr=1) try: br['user'] = self.username except: br['name'] = self.username br['pass'] = self.password self.log('Logging in...') raw = br.submit().read() if b'SIGN OUT' not in raw: raise ValueError( 'Failed to log in to tnr.com, check your username and password') self.log('Logged in successfully') return br def parse_index(self): raw = self.index_to_soup( 'http://www.newrepublic.com/current-issue', raw=True) # raw = self.index_to_soup(open('/t/raw.html').read().decode('utf-8'), raw=True) for pat, sub in self.preprocess_regexps: raw = pat.sub(sub, raw) soup = self.index_to_soup(raw) feed_title = 'The New Republic Magazine Articles' articles = [] for div in soup.findAll('div', attrs={'class': lambda x: x and 'field-item' in x.split()}): a = div.find('a', href=True, attrs={ 'class': lambda x: x != 'author'}) if a is not None: art_title = self.tag_to_string(a) url = a.get('href') num = re.search(r'/(\d+)/', url) if num is not None: art = num.group(1) url = 'http://www.newrepublic.com/node/%s/print' % art self.log.info('\tFound article:', art_title, 'at', url) article = {'title': art_title, 'url': url, 'description': '', 'date': ''} articles.append(article) return [(feed_title, articles)]