From 1845cde8d2c35b7f14a66f603dc820ea9f5cfd20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B2?= Date: Tue, 22 Jul 2025 10:05:27 +0500 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ report fns.txt | 50 +++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 main.py create mode 100644 report fns.txt diff --git a/main.py b/main.py new file mode 100644 index 0000000..6776a2e --- /dev/null +++ b/main.py @@ -0,0 +1,117 @@ +import requests +from bs4 import BeautifulSoup +from pprint import pprint +import os + +URL_FNS = "https://formats.saby.ru/report/fns" +URL_FORMATS = 'https://formats.saby.ru' +response = requests.get(URL_FNS) +filename_report_fns = 'report fns.txt' +if 200 <= response.status_code <= 299: + pass +else: + print("Ошибка при запросе:", response.status_code) + +# Парсинг HTML +soup = BeautifulSoup(response.text, 'html.parser') +# Содрежит url всех записей +list_report_fns = [] +# Содержит URL и имя всех записей +list_for_user = [] +# Цикл в котором добавляем в лист url ввида: +# https://formats.saby.ru/report/fns/116682 +for link in soup.find_all('a'): + href = link.get('href') + pprint(href) + if '/report/fns/' in href: + list_report_fns.append(f'{URL_FORMATS}{href}') + link = soup.find('a', href=href) + span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName") + list_for_user.append(f'{URL_FORMATS}{href} {span.text}') + +def write_report_fns(filename, dict_name = dict): + """ + Сохраняем запись: + https://formats.saby.ru/report/fns/106013 Действующий формат (с 26.02.24) 5.04 + """ + with open(filename, 'w', encoding='utf-8') as f: + for key, value in dict_name.items(): + str_k_v = f'{key}: {value}\n' + f.write(str_k_v) + +def date_report_fns(list_fns = list): + """ + Функия ожидает list из URL + Заходит на каждый URL, запоминает дату. + Возвращает словарь ввида: + {'https://formats.saby.ru//report/fns/99219': 'Действующий формат (с 01.01.16) 5.05', ...} + """ + # Итоговый словарь + dict_result = {} + # Перебераем URL из аргумента функции + for url_fns in list_fns: + # Запрос страницы: + response_fns = requests.get(url_fns) + print(response_fns.status_code) + # Парсинг в HTML + soup_fns = BeautifulSoup(response_fns.text, 'html.parser') + # Поиск в HTML строки ввида: Действующий формат (с 10.01.23) 5.01 + div_element = soup_fns.find('div', class_='controls-Dropdown__text') + # Извлекаем текст из элемента + text = div_element.get_text() + # Создаем словарь из URL и строки содрежащий актуальность записи + dict_appen = {url_fns: text} + # Добавляем в итоговый словарь + dict_result.update(dict_appen) + return dict_result + +def actual_report_fns(dict_open, dict_new): + """ + Функция принимает два словаря: + - dict_open из файла. + - dict_new из HTML + Ищет изменения в словарях + Возвращает один актуальный словарь. + """ + dict_result = {} + # Ключи, которые есть в dict_open, но нет в dict_new + missing_in_new_dict_fns = {k: dict_open[k] for k in dict_open if k not in dict_new} + # Ключи, которые есть в new_dict_fns, но нет в dict_open + missing_in_dict_open_report_fns = {k: dict_new[k] for k in dict_new if k not in dict_open} + # Ключи с разными значениями + # value_diff = {k: (dict_open[k], dict_new[k]) for k in dict_open if k in dict_new and dict_open[k] != dict_new[k]} + value_diff = {k: dict_open[k] for k in dict_open if k in dict_new and dict_open[k] != dict_new[k]} + print('Запись не существует', missing_in_dict_open_report_fns) + print('Новые записи: ', missing_in_new_dict_fns) + print('Изменение записи', value_diff) + #Словарь с записями котоыре нужно удалить + dict_del = {} + dict_del.update(missing_in_dict_open_report_fns) + dict_del.update(value_diff) + # Удаляем из словря(который записан в файле) данные, записи которых больше не существует: + dict_result = {k: v for k, v in dict_open.items() if k not in dict_del} + # Добаляем новые записи + dict_result.update(missing_in_new_dict_fns) + dict_result.update(value_diff) + write_report_fns(filename_report_fns, dict_result) + + + +new_dict_fns = date_report_fns(list_report_fns) + +# Проверка есть ли файл +if os.path.exists(filename_report_fns): + dict_open_report_fns = {} + with open(filename_report_fns, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip().split(': ') + dict_line = {line[0]:line[1]} + dict_open_report_fns.update(dict_line) + if dict_open_report_fns == new_dict_fns: + print('равны') + else: + print('не равны') + actual_report_fns(dict_open_report_fns, new_dict_fns) +else: + write_report_fns(filename_report_fns, new_dict_fns) + diff --git a/report fns.txt b/report fns.txt new file mode 100644 index 0000000..480ee88 --- /dev/null +++ b/report fns.txt @@ -0,0 +1,50 @@ +https://formats.saby.ru/report/fns/128513: Действующий формат (с 01.07.22) 5.03 +https://formats.saby.ru/report/fns/130840: Действующий формат (с 01.01.23) 5.01 +https://formats.saby.ru/report/fns/120166: Действующий формат (с 01.01.25) 5.07 +https://formats.saby.ru/report/fns/120180: Действующий формат (с 01.01.24) 5.05 +https://formats.saby.ru/report/fns/120092: Действующий формат (с 01.01.25) 5.11 +https://formats.saby.ru/report/fns/50271: Действующий формат (с 09.01.23) 5.04 +https://formats.saby.ru/report/fns/120117: Действующий формат (с 01.01.25) 5.12 +https://formats.saby.ru/report/fns/141442: Действующий формат (с 01.01.25) 5.02 +https://formats.saby.ru/report/fns/121867: Действующий формат (с 01.01.25) 5.08 +https://formats.saby.ru/report/fns/118785: Действующий формат (с 01.01.19) 5.03 +https://formats.saby.ru/report/fns/120344: Действующий формат (с 15.12.20) 5.09 +https://formats.saby.ru/report/fns/121160: Действующий формат (с 12.07.21) 5.02 +https://formats.saby.ru/report/fns/118611: Действующий формат (с 01.01.19) 5.08 +https://formats.saby.ru/report/fns/99720: Действующий формат (с 13.12.22) 5.03 +https://formats.saby.ru/report/fns/119230: Действующий формат (с 01.01.15) 5.08 +https://formats.saby.ru/report/fns/121163: Действующий формат (с 01.01.25) 5.12 +https://formats.saby.ru/report/fns/126058: Действующий формат (с 19.12.24) 5.03 +https://formats.saby.ru/report/fns/116682: Действующий формат (с 10.01.23) 5.04 +https://formats.saby.ru/report/fns/117433: Действующий формат (с 01.01.18) 5.05 +https://formats.saby.ru/report/fns/120421: Действующий формат (с 01.01.25) 5.19 +https://formats.saby.ru/report/fns/99219: Действующий формат (с 01.01.16) 5.05 +https://formats.saby.ru/report/fns/120181: Действующий формат (с 02.01.00) 5.02 +https://formats.saby.ru/report/fns/99213: Действующий формат (с 01.01.16) 5.04 +https://formats.saby.ru/report/fns/119699: Действующий формат (с 01.01.24) 5.03 +https://formats.saby.ru/report/fns/122284: Действующий формат (с 16.01.18) 5.02 +https://formats.saby.ru/report/fns/106538: Действующий формат (с 01.08.23) 5.04 +https://formats.saby.ru/report/fns/76642: Действующий формат (с 01.01.16) 5.01 +https://formats.saby.ru/report/fns/133796: Действующий формат (с 19.08.19) 5.02 +https://formats.saby.ru/report/fns/32042: Действующий формат (с 01.10.13) 4.02 +https://formats.saby.ru/report/fns/120165: Действующий формат (с 18.02.24) 5.03 +https://formats.saby.ru/report/fns/77900: Действующий формат (с 13.11.15) 5.01 +https://formats.saby.ru/report/fns/118112: Действующий формат (с 10.01.23) 5.02 +https://formats.saby.ru/report/fns/120627: Действующий формат (с 16.12.23) 5.05 +https://formats.saby.ru/report/fns/121754: Действующий формат (с 01.01.21) 5.05 +https://formats.saby.ru/report/fns/121952: Действующий формат (с 01.01.25) 5.10 +https://formats.saby.ru/report/fns/120348: Действующий формат (с 02.11.12) 5.02 +https://formats.saby.ru/report/fns/126016: Действующий формат (с 01.01.25) 5.02 +https://formats.saby.ru/report/fns/117431: Действующий формат (с 01.01.18) 5.06 +https://formats.saby.ru/report/fns/71563: Действующий формат (с 01.01.15) 5.01 +https://formats.saby.ru/report/fns/117432: Действующий формат (с 01.01.18) 5.06 +https://formats.saby.ru/report/fns/120287: Действующий формат (с 02.12.20) 5.02 +https://formats.saby.ru/report/fns/120172: Действующий формат (с 18.02.24) 5.03 +https://formats.saby.ru/report/fns/131129: Действующий формат (с 10.01.23) 5.01 +https://formats.saby.ru/report/fns/120619: Действующий формат (с 31.08.11) 5.02 +https://formats.saby.ru/report/fns/120968: Действующий формат (с 01.01.13) 5.02 +https://formats.saby.ru/report/fns/117430: Действующий формат (с 01.01.18) 5.05 +https://formats.saby.ru/report/fns/106013: Действующий формат (с 26.02.24) 5.04 +https://formats.saby.ru/report/fns/7676: Действующий формат (с 13.04.10) 5.02 +https://formats.saby.ru/report/fns/117553: Действующий формат (с 01.01.25) 5.05 +https://formats.saby.ru/report/fns/46181: Действующий формат (с 01.01.22) 3.00004