Skip to content

Instantly share code, notes, and snippets.

@erikcs
Last active September 17, 2016 08:16
Show Gist options
  • Save erikcs/bce55cf8664db86179935729d282b255 to your computer and use it in GitHub Desktop.
Save erikcs/bce55cf8664db86179935729d282b255 to your computer and use it in GitHub Desktop.
get calender data
#!/usr/bin/env python
import bs4
import requests
import re
import icalendar
import pytz
from datetime import datetime
import os
def datestr_to_dateobj(datestr):
return pytz.timezone('Europe/Stockholm').localize(
datetime.strptime(datestr, '%Y-%m-%d, %H:%M'))
def parse_seminars(soup):
"""Return a dictionary with keys `startdate` (datetime) and values (string) {`title`, `speaker`}"""
seminars = {}
seminar_section = soup.find('ul', {'class': 'page-list'})
if seminar_section is None:
return seminars
for elems in seminar_section:
if elems == '\n':
continue
date_time, = re.findall(r"([0-9]{4}-[0-9]{2}-[0-9]{2}.*[0-9]{2}:[0-9]{2})",
elems.find('div', {'class': 'page-list__date'}).get_text())
seminars[datestr_to_dateobj(date_time)] = {'title': elems.find('h2').get_text(),
'speaker': elems.find('p').get_text()}
return seminars
def toical(seminars):
cal = icalendar.Calendar()
cal.add('prodid', 'SSE Finance seminars')
cal.add('version', '2.0')
for date in seminars:
event = icalendar.Event()
event.add('summary', '{} ({})'.format(seminars[date]['title'], seminars[date]['speaker']))
event.add('dtstart', date)
cal.add_component(event)
return cal
# Main
urls = ['https://www.hhs.se/en/Research/Departments/DF/seminars/brown-bags/',
'https://www.hhs.se/en/Research/Departments/DF/seminars/brown-bags/?hhspn=2',
'https://www.hhs.se/en/Research/Departments/DF/seminars/seminars/']
soups = map(lambda x: bs4.BeautifulSoup(requests.get(x).content, 'lxml'), urls)
seminars = {k: v for d in map(parse_seminars, soups) for k, v in d.items()}
cal = toical(seminars)
f = open(os.getcwd() + '/seminars.ics', 'wb')
f.write(cal.to_ical())
f.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment