Web page parser, extracts production calendar from https://superjob.ru
Parsed result is a structured dictionary stored in JSON file(s)
Парсер извлекает производственный календарь разных лет с сайта https://superjob.ru
Результат сохраняется структурой словаря в JSON файл(ы)
Example of procaparser result dictionary structure
{ '2023': { '1': { '1': { 'dnum': 1, 'dweek': 7, 'dtype': 3, 'ttip': 'Праздничный день. Новогодние каникулы' }, '2': { ... # next day }, }, '2': { ... # next month }, } }Contains proca classes for working with production calendar data
proca builds objects of a calendar based on dictionary data
such data in JSON files may be parsed and prepared with procaparser
or just get JSON files from this repository
Содержит proca классы для работы с производственными календарями
proca создает объекты календарей на основе словаря с данными
такие данные в JSON формате могут быть спарсены при помощи procaparser
или есть уже готовые JSON файлы данных в этом репозитории
Code examples of using proca is in proca_examples.py
Примеры python кода в файле proca_examples.py
Code examples with proca classes
import proca import json # Returns dictionary loaded from JSON file def readJSON(fileName): with open(fileName) as fileJSON: data = json.load(fileJSON) return data # Construct object 2023 year production calendar # from source JSON file year = proca.ProcaYear(readJSON('sjob_min_2023.json')) # Make 1st quarter months of the year months = year(1, 2, 3, 4) # Get January by alias 'jan' jan = months.jan # Print January days table print(jan)result:
2023.01.01 | 7 Воскресенье | 3 Праздничный день. Новогодние каникулы 2023.01.02 | 1 Понедельник | 3 Праздничный день 2023.01.03 | 2 Вторник | 3 Праздничный день 2023.01.04 | 3 Среда | 3 Праздничный день 2023.01.05 | 4 Четверг | 3 Праздничный день 2023.01.06 | 5 Пятница | 3 Праздничный день 2023.01.07 | 6 Суббота | 3 Праздничный день. Рождество Христово 2023.01.08 | 7 Воскресенье | 3 Праздничный день 2023.01.09 | 1 Понедельник | 0 Рабочий 2023.01.10 | 2 Вторник | 0 Рабочий 2023.01.11 | 3 Среда | 0 Рабочий 2023.01.12 | 4 Четверг | 0 Рабочий 2023.01.13 | 5 Пятница | 0 Рабочий 2023.01.14 | 6 Суббота | 2 Выходной 2023.01.15 | 7 Воскресенье | 2 Выходной 2023.01.16 | 1 Понедельник | 0 Рабочий 2023.01.17 | 2 Вторник | 0 Рабочий 2023.01.18 | 3 Среда | 0 Рабочий 2023.01.19 | 4 Четверг | 0 Рабочий 2023.01.20 | 5 Пятница | 0 Рабочий 2023.01.21 | 6 Суббота | 2 Выходной 2023.01.22 | 7 Воскресенье | 2 Выходной 2023.01.23 | 1 Понедельник | 0 Рабочий 2023.01.24 | 2 Вторник | 0 Рабочий 2023.01.25 | 3 Среда | 0 Рабочий 2023.01.26 | 4 Четверг | 0 Рабочий 2023.01.27 | 5 Пятница | 0 Рабочий 2023.01.28 | 6 Суббота | 2 Выходной 2023.01.29 | 7 Воскресенье | 2 Выходной 2023.01.30 | 1 Понедельник | 0 Рабочий 2023.01.31 | 2 Вторник | 0 Рабочий # Show January info using month fields print(f'{jan.name}:', f'рабочих дн: {jan.twork}', f'выходных дн: {jan.trest}', f'всего дн: {jan.tdays}', sep='\n')result:
Январь: рабочих дн: 17 выходных дн: 14 всего дн: 31 # Get 7th day of January by alias 'd7' d7 = jan.days.d7 # Print day info table print(d7) # Show day info using day fields print(f'дата: {d7.dnum:02d}.{d7.mnum:02d}.{d7.ynum}', f'день недели: {d7.name}', f'выходной день: {"Да" if d7.rest == 1 else "Нет"}', f'праздник: {d7.ttip if d7.dtype == 3 else "Нет"}', sep='\n')result:
2023.01.07 | 6 Суббота | 3 Праздничный день. Рождество Христово дата: 07.01.2023 день недели: Суббота выходной день: Да праздник: Праздничный день. Рождество Христово # Make 12 months (it's default if not args passed) months = year() # Table header stick = ' | ' fields_width = {'mnum': 2, 'name': 8, 'tdays': 4, 'twork': 4, 'trest': 4} fields_ru = {'mnum': '#', 'name': 'мес.', 'tdays': 'дн.', 'twork': 'раб.', 'trest': 'вых.'} # Show table header print(*[fields_ru[f].ljust(w) for f, w in fields_width.items()], sep=stick) # Show top line print('-' * (sum(fields_width.values()) + len(stick)*4)) # Show months info table for m in months: row = [] for f, w in fields_width.items(): if f == 'mnum': # 2 pos digit with leading zero cell = f'{getattr(m, f):02d}'.rjust(w) else: cell = str(getattr(m, f)).ljust(w) row.append(cell) print(*row, sep=stick) # Show bottom line print('-' * (sum(fields_width.values()) + len(stick)*4)) # Calculate totals by 12 months fields_total = ('tdays', 'twork', 'trest') totals = {f: sum(getattr(m, f, 0) for m in months) for f in fields_total} # Show table totals print(*[str(totals[f]).ljust(w) if f in fields_total else ''.ljust(w) for f, w in fields_width.items()], sep=' | ')result:
# | мес. | дн. | раб. | вых. ---------------------------------- 01 | Январь | 31 | 17 | 14 02 | Февраль | 28 | 18 | 10 03 | Март | 31 | 22 | 9 04 | Апрель | 30 | 20 | 10 05 | Май | 31 | 20 | 11 06 | Июнь | 30 | 21 | 9 07 | Июль | 31 | 21 | 10 08 | Август | 31 | 23 | 8 09 | Сентябрь | 30 | 21 | 9 10 | Октябрь | 31 | 22 | 9 11 | Ноябрь | 30 | 21 | 9 12 | Декабрь | 31 | 21 | 10 ---------------------------------- | | 365 | 247 | 118