105 lines
4.1 KiB
Python
105 lines
4.1 KiB
Python
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)
|