import requests from bs4 import BeautifulSoup from pprint import pprint import os import re # Зашлушка, тут должен быть другой utl или список url URL_TITLE = "https://formats.saby.ru/report/fns" # Перенапраляет на https://formats.saby.ru/respons URL_FORMATS = 'https://formats.saby.ru' # Имя сохраняемого файла filename_report = 'report fns.txt' def parse_html(url=str): """ Фунция принимает строку URL, Делает запрос, создает объект HTML вовращаем обьект """ response = requests.get(url) if not(200 <= response.status_code <= 299): print("Ошибка при запросе:", response.status_code) return response.status_code # Создание обьекта HTML soup = BeautifulSoup(response.text, 'html.parser') return soup def parse_date_title(url=str): """ Функия ожидает list из URL ввида: url = https://formats.saby.ru/report/fns/128513 Заходит на каждый URL, запоминает дату. Возвращает словарь две строки: date = 01.07.22 id_date = 5.01data_title """ # Запрос страницы: response = requests.get(url) # Проверка статуса запроса if not(200 <= response.status_code <= 299): print('parse_date_title: ', response.status_code) return response.status_code # Парсинг в HTML soup_fns = BeautifulSoup(response.text, 'html.parser') # Поиск в HTML строки ввида: Действующий формат (с 10.01.23) 5.01 div_element = soup_fns.find('div', class_='controls-Dropdown__text') # Извлекаем текст из элемента text = div_element.get_text() regex = r'.+\D+(\d+\D+\d+\D+\d+).+(\d+\D+\d+)' date, id_date = re.search(regex, text).groups() return date, id_date def parse_reports(soup=BeautifulSoup, url=str): """ Ожидается url ввида: https://formats.saby.ru/reports/{title}/{id} Достаются все необходимые данные, возвращаются в ввиде словаря: {106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')} """ # Содрежит url всех записей list_report_url = [] dict_data = {} # Ищет последний значение в url(пока заглушка) title = URL_TITLE.rstrip('/').split('/')[-1] # Цикл в котором добавляем в лист url ввида: # https://formats.saby.ru/report/fns/116682 for link in soup.find_all('a'): # Ищет по тегу: href href = link.get('href') if f'/report/{title}/' in href: # id записи id = href.rstrip('/').split('/')[-1] #URL всех записей url_title = f'{url}{href}' list_report_url.append(url_title) link = soup.find('a', href=href) # Имя записи span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName") # Передаем текущию запись цикла date, id_date = parse_date_title(url_title) # Добавление всех данных в итоговый словарь dict_data.update({id: (title, span.text, date, id_date)}) return dict_data def write_report_data(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) # Объект HTML html = parse_html(URL_FORMATS) # Словарь с нужными данными dict_result = parse_reports(html, URL_FORMATS) # Запись данных в текстовый файл write_report_data(filename_report, dict_result)