Необходимые библиотеки

In [ ]:
import json
import re # библиотека для регулярных выражений
import requests # библиотека для запросов
from bs4 import BeautifulSoup # библиотека для парсинга
In [ ]:
DOMAIN = 'https://www.herzen.spb.ru'
DOMAIN_ATLAS = 'https://atlas.herzen.spb.ru/'

RESULT = []

Поиск названия института в списке с https://www.herzen.spb.ru/main/structure/inst/

In [ ]:
def search(inst):
    for i in range(len(RESULT)):
        if (RESULT[i])['inst_name'].lower().strip() == inst:
            return i

Поиск управляющего на странице кафедры

In [ ]:
def dep_html(url):
    bs = BeautifulSoup(requests.get(url).text, 'html.parser') 
    table = bs.find_all(href=re.compile('teacher')) # все преподаватели
    req = bs.find_all(class_='mm1')[2].string.split(', ')[0] # завкаф

    for teacher in table:
        teacher_name = teacher.string.strip()

        if teacher_name == req:
            return [teacher_name, teacher_html(DOMAIN_ATLAS + teacher['href'])]

Поиск почты на странице управляющего

In [ ]:
def teacher_html(url):
    bs = BeautifulSoup(requests.get(url).text, 'html.parser')
    mail = bs.find_all(href=re.compile('mailto:'))[0].string
    if mail is not None:
      return mail
    return 'Почта не найдена'

Парсинг всех институтов с главной страницы https://www.herzen.spb.ru/main/structure/inst/

In [ ]:
bs = BeautifulSoup(requests.get('https://www.herzen.spb.ru/main/structure/inst/').text, 'html.parser')
inst_list = bs.find('td', {'class': 'blockwh'}).div.ul.contents

for item in inst_list:
  print((item.string, DOMAIN + item.a['href']))
  RESULT.append({'inst_name': item.string, 'url': DOMAIN + item.a['href'], 'dep_list': []})

print(RESULT)
('Институт музыки, театра и хореографии', 'https://www.herzen.spb.ru/main/structure/inst/imtx/')
('Институт художественного образования ', 'https://www.herzen.spb.ru/main/structure/inst/arts/')
('Институт русского языка как иностранного', 'https://www.herzen.spb.ru/main/structure/fukultets/ru/')
('Институт иностранных языков', 'https://www.herzen.spb.ru/main/structure/inst/inyaz/')
('Институт истории и социальных наук', 'https://www.herzen.spb.ru/main/structure/inst/soc/')
('Институт востоковедения', 'https://www.herzen.spb.ru/main/structure/inst/vostok/')
('Институт экономики и управления', 'https://www.herzen.spb.ru/main/structure/inst/iem/')
('Институт физической культуры и спорта', 'https://www.herzen.spb.ru/main/structure/inst/ifks/')
('Институт психологии', 'https://www.herzen.spb.ru/main/structure/inst/ipp/')
('Институт педагогики', 'https://www.herzen.spb.ru/main/structure/inst/instp/')
('Институт народов Севера', 'https://www.herzen.spb.ru/main/structure/inst/ins/')
('Институт дефектологического образования и реабилитации', 'https://www.herzen.spb.ru/main/structure/inst/idor/')
('Институт информационных технологий и технологического образования', 'https://www.herzen.spb.ru/main/structure/inst/iknto/')
('Институт философии человека', 'https://www.herzen.spb.ru/main/structure/inst/ifch/')
('Институт физики', 'https://www.herzen.spb.ru/main/structure/fukultets/fiz/')
('Институт детства', 'https://www.herzen.spb.ru/main/structure/inst/detstvo/')
[{'inst_name': 'Институт музыки, театра и хореографии', 'url': 'https://www.herzen.spb.ru/main/structure/inst/imtx/', 'dep_list': []}, {'inst_name': 'Институт художественного образования ', 'url': 'https://www.herzen.spb.ru/main/structure/inst/arts/', 'dep_list': []}, {'inst_name': 'Институт русского языка как иностранного', 'url': 'https://www.herzen.spb.ru/main/structure/fukultets/ru/', 'dep_list': []}, {'inst_name': 'Институт иностранных языков', 'url': 'https://www.herzen.spb.ru/main/structure/inst/inyaz/', 'dep_list': []}, {'inst_name': 'Институт истории и социальных наук', 'url': 'https://www.herzen.spb.ru/main/structure/inst/soc/', 'dep_list': []}, {'inst_name': 'Институт востоковедения', 'url': 'https://www.herzen.spb.ru/main/structure/inst/vostok/', 'dep_list': []}, {'inst_name': 'Институт экономики и управления', 'url': 'https://www.herzen.spb.ru/main/structure/inst/iem/', 'dep_list': []}, {'inst_name': 'Институт физической культуры и спорта', 'url': 'https://www.herzen.spb.ru/main/structure/inst/ifks/', 'dep_list': []}, {'inst_name': 'Институт психологии', 'url': 'https://www.herzen.spb.ru/main/structure/inst/ipp/', 'dep_list': []}, {'inst_name': 'Институт педагогики', 'url': 'https://www.herzen.spb.ru/main/structure/inst/instp/', 'dep_list': []}, {'inst_name': 'Институт народов Севера', 'url': 'https://www.herzen.spb.ru/main/structure/inst/ins/', 'dep_list': []}, {'inst_name': 'Институт дефектологического образования и реабилитации', 'url': 'https://www.herzen.spb.ru/main/structure/inst/idor/', 'dep_list': []}, {'inst_name': 'Институт информационных технологий и технологического образования', 'url': 'https://www.herzen.spb.ru/main/structure/inst/iknto/', 'dep_list': []}, {'inst_name': 'Институт философии человека', 'url': 'https://www.herzen.spb.ru/main/structure/inst/ifch/', 'dep_list': []}, {'inst_name': 'Институт физики', 'url': 'https://www.herzen.spb.ru/main/structure/fukultets/fiz/', 'dep_list': []}, {'inst_name': 'Институт детства', 'url': 'https://www.herzen.spb.ru/main/structure/inst/detstvo/', 'dep_list': []}]

Парсинг кафедр с атласа https://atlas.herzen.spb.ru/faculty.php

In [ ]:
bs = BeautifulSoup(requests.get('https://atlas.herzen.spb.ru/faculty.php').text, 'html.parser')
dep_list = bs.find('td', {'class': 'body'}).div.ul.contents

for item in dep_list:
  dep = []
  inst_index = search(item.a.string.lower().strip())

  if inst_index is not None:
    for i in item.ul:
      if i.string.lower().strip().startswith('кафедра'):
        boss = dep_html(DOMAIN_ATLAS + i.a['href'])

        if boss is not None: # проверка на существование завкаф
          print({'dep_name': i.string.strip(), 'boss_name': boss[0], 'email': boss[1]})
          dep.append({'dep_name': i.string.strip(), 'boss_name': boss[0], 'email': boss[1]})

    RESULT[inst_index]['dep_list'] = dep
{'dep_name': 'кафедра восточных языков и лингводидактики', 'boss_name': 'Ден Анна', 'email': 'denanna2005den@yandex.ru'}
{'dep_name': 'кафедра китайской филологии', 'boss_name': 'Якунина Татьяна Вячеславовна', 'email': 'paulka@mail.ru'}
{'dep_name': 'кафедра языков и культур исламского мира', 'boss_name': 'Блондин Владимир Николаевич', 'email': None}
{'dep_name': 'кафедра возрастной психологии и педагогики семьи', 'boss_name': 'Николаева Елена Ивановна', 'email': 'klemtina@yandex.ru'}
{'dep_name': 'кафедра дошкольной педагогики', 'boss_name': 'Гогоберидзе Александра Гививна', 'email': None}
{'dep_name': 'кафедра начального естественно-математического образования', 'boss_name': 'Граничина Ольга Александровна', 'email': 'olga_granichina@mail.ru'}
{'dep_name': 'кафедра педагогики начального образования и художественногого развития ребенка', 'boss_name': 'Савинова Людмила Юрьевна', 'email': 'ludmila.savinova@bk.ru'}
{'dep_name': 'кафедра раннего обучения иностранным языкам', 'boss_name': 'Погосян Виктория Акоповна', 'email': 'vpogosyan@herzen.spb.ru'}
{'dep_name': 'кафедра языкового и литературного образования ребенка', 'boss_name': 'Елисеева Марина Борисовна', 'email': 'melyseeva@yandex.ru'}
{'dep_name': 'кафедра логопедии', 'boss_name': 'Лопатина Людмила Владимировна', 'email': 'l.v.lopatina@mail.ru'}
{'dep_name': 'кафедра олигофренопедагогики', 'boss_name': 'Ильина Светлана Юрьевна', 'email': 'swetil@yandex.ru'}
{'dep_name': 'кафедра основ дефектологии и реабилитологии', 'boss_name': 'Волкова Ирина Павловна', 'email': 'volkova52@mail.ru'}
{'dep_name': 'кафедра сурдопедагогики', 'boss_name': 'Красильникова Ольга Александровна', 'email': 'ekoryukina@yandex.ru'}
{'dep_name': 'кафедра тифлопедагогики', 'boss_name': 'Никулина Галина Владимировна', 'email': 'gnikulina40@gmail.com'}
{'dep_name': 'кафедра английского языка для профессиональной коммуникации', 'boss_name': 'Белоглазова Елена Владимировна', 'email': 'evbeloglazova@herzen.spb.ru'}
{'dep_name': 'кафедра английского языка и лингвострановедения', 'boss_name': 'Чемодурова Зинаида Марковна', 'email': 'zchemodurova@herzen.spb.ru'}
{'dep_name': 'кафедра английской филологии', 'boss_name': 'Сергаева Юлия Владимировна', 'email': 'sergaeva@gmail.com'}
{'dep_name': 'кафедра интенсивного обучения иностранным языкам', 'boss_name': 'Комарова Юлия Александровна', 'email': None}
{'dep_name': 'кафедра методики обучения иностранным языкам', 'boss_name': 'Трубицина Ольга Ивановна', 'email': 'truwat@bk.ru'}
{'dep_name': 'кафедра немецкого и романских языков для профессиональной коммуникации', 'boss_name': 'Зайцева Наталья Юрьевна', 'email': None}
{'dep_name': 'кафедра немецкой филологии', 'boss_name': 'Копчук Любовь Борисовна', 'email': 'lkopchuk@herzen.spb.ru'}
{'dep_name': 'кафедра перевода', 'boss_name': 'Ачкасов Андрей Валентинович', 'email': 'a_v_achkasov@mail.ru'}
{'dep_name': 'кафедра романской филологии', 'boss_name': 'Становая Лидия Анатольевна', 'email': 'lida_stan@mail.ru'}
{'dep_name': 'кафедра языков Северной Европы', 'boss_name': 'Осьмак Наталья Андреевна', 'email': 'nataliaosmak@herzen.spb.ru; natalia.osmak@yandex.ru'}
{'dep_name': 'кафедра информационных систем', 'boss_name': 'Флегонтов Александр Владимирович', 'email': 'flegontoff@yandex.ru'}
{'dep_name': 'кафедра информационных технологий и электронного обучения', 'boss_name': 'Власова Елена Зотиковна', 'email': 'vip.zavkaf@mail.ru'}
{'dep_name': 'кафедра технологического образования', 'boss_name': 'Сарже Анна Владимировна', 'email': 'sarzheav@mail.ru'}
{'dep_name': 'кафедра цифрового образования', 'boss_name': 'Носкова Татьяна Николаевна', 'email': 'noskovatn@gmail.com'}
{'dep_name': 'кафедра всеобщей истории', 'boss_name': 'Кудрявцева Татьяна Владимировна', 'email': 'tatyanavk@yandex.ru'}
{'dep_name': 'кафедра истории', 'boss_name': 'Барышников Михаил Николаевич', 'email': 'barmini@list.ru'}
{'dep_name': 'кафедра истории России с древнейших времен до начала XIX века', 'boss_name': 'Соколов Роман Александрович', 'email': None}
{'dep_name': 'кафедра истории религий и теологии', 'boss_name': 'Прилуцкий Александр Михайлович', 'email': 'aprilutskiy@herzen.spb.ru'}
{'dep_name': 'кафедра методики обучения истории и обществознанию', 'boss_name': 'Кузин Дмитрий Владимирович', 'email': 'dmitrij_kuzin@mail.ru'}
{'dep_name': 'кафедра политологии', 'boss_name': 'Гайнутдинова Людмила Александровна', 'email': 'lgaynutdinova@list.ru'}
{'dep_name': 'кафедра русской истории (XIX-XXI вв.)', 'boss_name': 'Николаев Андрей Борисович', 'email': 'abnikolaev@herzen.spb.ru'}
{'dep_name': 'кафедра социологии', 'boss_name': 'Воронцов Алексей Васильевич', 'email': 'vorontsov@herzen.spb.ru'}
{'dep_name': 'кафедра музыкально-инструментальной подготовки', 'boss_name': 'Кузнецова Елена Олеговна', 'email': 'kuznetsovaeo@herzen.spb.ru'}
{'dep_name': 'кафедра музыкального воспитания и образования', 'boss_name': 'Шитикова Раиса Григорьевна', 'email': 'rshitikova@mail.ru'}
{'dep_name': 'кафедра сольного пения', 'boss_name': 'Смелкова Татьяна Дмитриевна', 'email': 'smelkova@list.ru'}
{'dep_name': 'кафедра театрального искусства', 'boss_name': 'Паршин Сергей Иванович', 'email': 'teatrart_rgpu@mail.ru'}
{'dep_name': 'кафедра хореографического искусства', 'boss_name': 'Касиманова Людмила Альбертовна', 'email': 'ludmila.kasimanova@mail.ru'}
{'dep_name': 'кафедра хорового дирижирования', 'boss_name': 'Матюхов Игорь Гаврилович', 'email': None}
{'dep_name': 'кафедра алтайских языков, фольклора и литературы', 'boss_name': 'Назмутдинова Татьяна Станиславовна', 'email': 'scurumoch@mail.ru'}
{'dep_name': 'кафедра палеоазиатских языков, фольклора и литературы', 'boss_name': 'Гашилова Людмила Борисовна', 'email': 'gashilova@mail.ru'}
{'dep_name': 'кафедра уральских языков, фольклора и литературы', 'boss_name': 'Мызников Сергей Алексеевич', 'email': 'myznikovs57@mail.ru'}
{'dep_name': 'кафедра этнокультурологии', 'boss_name': 'Набок Игорь Леонтьевич', 'email': None}
{'dep_name': 'кафедра истории педагогики и образования', 'boss_name': 'Федорова Наталья Михайловна', 'email': None}
{'dep_name': 'кафедра педагогики школы', 'boss_name': 'Пискунова Елена Витальевна', 'email': 'didaktika@herzen.spb.ru'}
{'dep_name': 'кафедра теории и методики непрерывного педагогического образования', 'boss_name': 'Тряпицын Александр Вячеславович', 'email': 'triap2006@mail.ru'}
{'dep_name': 'кафедра теории и методики воспитания и социальной работы', 'boss_name': 'Кривых Сергей Викторович', 'email': None}
{'dep_name': 'кафедра клинической психологии и психологической помощи', 'boss_name': 'Алехин Анатолий Николаевич', 'email': 'kcp_herzen@mail.ru'}
In [ ]:
with open('parse.json', 'w') as f:
  f.write(json.dumps(RESULT, ensure_ascii=False))