#!/usr/bin/env python # vim:fileencoding=utf-8 from calibre.web.feeds.recipes import BasicNewsRecipe def absurl(url): if url.startswith('//'): return 'https:' + url if url.startswith('/'): return 'https://www.psychologytoday.com' + url return url def classes(classes): q = frozenset(classes.split(' ')) return dict(attrs={ 'class': lambda x: x and frozenset(x.split()).intersection(q)}) class PsychologyToday(BasicNewsRecipe): title = 'Psychology Today' __author__ = 'Kovid Goyal' description = ('This magazine takes information from the latest research' ' in the field of psychology and makes it useful to people in their everyday' ' lives. Its coverage encompasses self-improvement, relationships, the mind-body' ' connection, health, family, the workplace and culture.') language = 'en' encoding = 'UTF-8' no_stylesheets = True publication_type = 'magazine' remove_attributes = ['style', 'height', 'width'] extra_css = ''' .image-article_inline_full, .image-article-inline-half { text-align:center; font-size:small; } em, blockquote { color:#202020; } .blog-entry__date--full { font-size:small; } ''' recipe_specific_options = { 'date': { 'short': 'The date of the Past Edition to download (YYYY/MM format)', 'long': 'For example, 2024/07' } } keep_only_tags = [dict(attrs={'id': 'block-pt-content'})] remove_tags = [classes('pt-social-media')] def parse_index(self): soup = self.index_to_soup('https://www.psychologytoday.com/us/magazine/archive') a = soup.find(**classes('magazine-thumbnail')).a url = a['href'] past_edition = self.recipe_specific_options.get('date') if past_edition and isinstance(past_edition, str): url = '/us/magazine/archive/' + past_edition soup = self.index_to_soup(absurl(url)) cov = soup.find(**classes('content-header--cover-image')) if cov: self.cover_url = cov.img['src'] self.timefmt = ' [%s]' % cov.img['alt'].replace(' magazine cover', '') articles = [] for article in soup.findAll('div', attrs={'class':'article-text'}): title = self.tag_to_string(article.find(attrs={'class':['h2','h3']})).strip() url = absurl(article.find(attrs={'class':['h2','h3']}).a['href']) self.log('\n', title, 'at', url) desc = self.tag_to_string(article.find('p',**classes('description'))).strip() author = self.tag_to_string(article.find('p',**classes('byline')).a).strip() if desc: self.log(desc) else: desc = '' articles.append({'title': title, 'url': url, 'description': desc, 'author': author}) return [('Articles', articles)]