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)