рабочая верся, но требует рефакторинг
parent
6642d50fe7
commit
e6e7ebe66c
|
|
@ -0,0 +1,138 @@
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from pprint import pprint
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def parse_html(url=str):
|
||||||
|
"""
|
||||||
|
Фунция принимает строку URL,
|
||||||
|
выполняет запрос,
|
||||||
|
создает и возращает объект BeautifulSoup(HTML).
|
||||||
|
"""
|
||||||
|
# Запрос страницы
|
||||||
|
response = requests.get(url)
|
||||||
|
# Проверка статуса страницы
|
||||||
|
if not(200 <= response.status_code <= 299):
|
||||||
|
print("Ошибка при запросе:", response.status_code)
|
||||||
|
return response.status_code
|
||||||
|
# Создание обьекта BeautifulSoup
|
||||||
|
soup = BeautifulSoup(response.text, 'html.parser')
|
||||||
|
return soup
|
||||||
|
|
||||||
|
def parse_date_report(url=str):
|
||||||
|
"""
|
||||||
|
Функия ожидает list из URL ввида:
|
||||||
|
url = https://formats.saby.ru/report/fns/128513
|
||||||
|
Заходит по URL, запоминает дату.
|
||||||
|
Возвращает две строки ввида:
|
||||||
|
'date = 01.07.22'
|
||||||
|
'id_date = 5.01'
|
||||||
|
"""
|
||||||
|
soup = parse_html(url)
|
||||||
|
# Поиск в HTML строки ввида: 'Действующий формат (с 10.01.23) 5.01'
|
||||||
|
div_element = soup.find('div', class_='controls-Dropdown__text')
|
||||||
|
# Извлекаем текст из элемента
|
||||||
|
text = div_element.get_text()
|
||||||
|
print(text, ' ',url)
|
||||||
|
#Парсим нужные данные
|
||||||
|
date = ''
|
||||||
|
id_date = ''
|
||||||
|
if ('_') in text:
|
||||||
|
regex = r'\w+\s\w+\s(\S+) (\S+)'
|
||||||
|
date, id_date = re.search(regex, text).groups()
|
||||||
|
else:
|
||||||
|
regex = r'(\d{2}\D\d{2}\D\d{2})(?:(?:.+)?\))? #?(\d+(?:\D\d+)?)'
|
||||||
|
date, id_date = re.search(regex, text).groups()
|
||||||
|
print('date: ', date, 'id: ', id_date)
|
||||||
|
return date, id_date
|
||||||
|
|
||||||
|
def parse_reports(soup=BeautifulSoup,
|
||||||
|
report_title = str,
|
||||||
|
url_formats = str,
|
||||||
|
name_title = str):
|
||||||
|
"""
|
||||||
|
Достаются все необходимые данные, возвращаются в ввиде словаря:
|
||||||
|
{106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}
|
||||||
|
"""
|
||||||
|
# Содрежит url всех report(не используется)
|
||||||
|
#list_report_url = []
|
||||||
|
result_dict_data = {}
|
||||||
|
# Перебарает все URL, ищутся по тегу 'a'
|
||||||
|
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_report = f'{url_formats}{href}'
|
||||||
|
#Добавление url в лист(не используется)
|
||||||
|
#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_report(url_report)
|
||||||
|
# Добавление всех данных в итоговый словарь
|
||||||
|
result_dict_data.update({id: (name_title, span.text, date, id_date)})
|
||||||
|
|
||||||
|
return result_dict_data
|
||||||
|
|
||||||
|
def write_report_data(filename, dict_name = dict, name_title = str):
|
||||||
|
"""
|
||||||
|
Сохраняем запись, каждая запись с новой строки:
|
||||||
|
'ключ: значение'
|
||||||
|
'ключ: значение'
|
||||||
|
"""
|
||||||
|
dash = '-'*30
|
||||||
|
with open(filename, 'a', encoding='utf-8') as f:
|
||||||
|
f.write(f'\n{dash}START_{name_title}{dash}\n')
|
||||||
|
for key, value in dict_name.items():
|
||||||
|
str_k_v = f'{key}: {value}\n'
|
||||||
|
f.write(str_k_v)
|
||||||
|
f.write(f'{dash}END_{name_title}{dash}\n')
|
||||||
|
|
||||||
|
def serth_title():
|
||||||
|
"""
|
||||||
|
Функция ищет все тайтлы,
|
||||||
|
возвращает лист сотоящий из:
|
||||||
|
['/report/fns', ...]
|
||||||
|
"""
|
||||||
|
url_format_report = 'https://formats.saby.ru/report'
|
||||||
|
html = parse_html(url_format_report)
|
||||||
|
list_reports = []
|
||||||
|
# Перебераем все URL
|
||||||
|
for link in html.find_all('a'):
|
||||||
|
# Ищет по тегу: href
|
||||||
|
href = link.get('href')
|
||||||
|
if re.search(r'\/report\/(\w+)$', href):
|
||||||
|
print('Cовпадение найдено: ', href)
|
||||||
|
list_reports.append(href)
|
||||||
|
return list_reports
|
||||||
|
|
||||||
|
# Имя файла в который будет записан результат кода
|
||||||
|
filename_save = 'ReportData.txt'
|
||||||
|
#Удаляем старые записи, что бы довабить новые
|
||||||
|
with open(filename_save, 'w') as f:
|
||||||
|
#Файл перезаписывается в пустой
|
||||||
|
f.write('')
|
||||||
|
# Лист имеет вид: ['/report/fns', '/report/sfr'...]
|
||||||
|
list_title = serth_title()
|
||||||
|
|
||||||
|
URL_FORMATS = 'https://formats.saby.ru'
|
||||||
|
|
||||||
|
for report_title in list_title:
|
||||||
|
name_title = report_title.rstrip('/').split('/')[-1]
|
||||||
|
|
||||||
|
url_title = f'{URL_FORMATS}{report_title}'
|
||||||
|
# Объект HTML
|
||||||
|
soup = parse_html(url_title)
|
||||||
|
# Словарь с нужными данными
|
||||||
|
dict_result = parse_reports(soup, report_title, URL_FORMATS, name_title)
|
||||||
|
# Запись данных в текстовый файл
|
||||||
|
write_report_data(filename_save, dict_result, name_title)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', '5.03')
|
|
||||||
130840: ('fns', 'Персонифицированные сведения', '01.01.23', '5.01')
|
|
||||||
120166: ('fns', 'Расчет по страховым взносам', '01.01.25', '5.07')
|
|
||||||
120180: ('fns', '6-НДФЛ (со справками 2-НДФЛ)', '01.01.24', '5.05')
|
|
||||||
120092: ('fns', 'НД по НДС', '01.01.25', '5.11')
|
|
||||||
50271: ('fns', 'Письмо в налоговую', '09.01.23', '5.04')
|
|
||||||
120117: ('fns', 'НД по прибыли', '01.01.25', '5.12')
|
|
||||||
141442: ('fns', 'Cообщение о фактах заключения договоров НПФ', '01.01.25', '5.02')
|
|
||||||
121867: ('fns', 'НД по УСН', '01.01.25', '5.08')
|
|
||||||
118785: ('fns', 'Упрощенная бухгалтерская (финансовая) отчетность', '01.01.19', '5.03')
|
|
||||||
120344: ('fns', '26.5-1 Заявление на получение патента', '15.12.20', '5.09')
|
|
||||||
121160: ('fns', 'Уведомление об уменьшении патента на сумму страховых взносов', '12.07.21', '5.02')
|
|
||||||
118611: ('fns', 'Бухгалтерская (финансовая) отчетность', '01.01.19', '5.08')
|
|
||||||
99720: ('fns', 'Согласие (отказ) на раскрытие налоговой тайны', '13.12.22', '5.03')
|
|
||||||
119230: ('fns', 'Заявление к косвенным налогам', '01.01.15', '5.08')
|
|
||||||
121163: ('fns', 'НД по налогу на имущество организаций', '01.01.25', '5.12')
|
|
||||||
126058: ('fns', 'Электронная доверенность ФНС', '19.12.24', '5.03')
|
|
||||||
116682: ('fns', 'Зачет сумм ЕНС', '10.01.23', '5.04')
|
|
||||||
117433: ('fns', 'Сведения по дебиторской и кредиторской задолженности учреждения', '01.01.18', '5.05')
|
|
||||||
120421: ('fns', '3-НДФЛ', '01.01.25', '5.19')
|
|
||||||
99219: ('fns', 'Отчет об исполнении учреждением плана ФХД', '01.01.16', '5.05')
|
|
||||||
120181: ('fns', 'Р13014 Изменение сведений ЮЛ', '02.01.00', '5.02')
|
|
||||||
99213: ('fns', 'Сведения об остатках денежных средств учреждения', '01.01.16', '5.04')
|
|
||||||
119699: ('fns', 'Расчет о суммах доходов, выплаченных иностранным организациям', '01.01.24', '5.03')
|
|
||||||
122284: ('fns', 'Представление документов (сведений)', '16.01.18', '5.02')
|
|
||||||
106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')
|
|
||||||
76642: ('fns', 'НД по водному налогу', '01.01.16', '5.01')
|
|
||||||
133796: ('fns', 'Уведомление о невозможности представления', '19.08.19', '5.02')
|
|
||||||
32042: ('fns', 'Единая (упрощенная) налоговая декларация', '01.10.13', '4.02')
|
|
||||||
120165: ('fns', 'Р24001 Изменение сведений ИП', '18.02.24', '5.03')
|
|
||||||
77900: ('fns', 'Заявление о праве на уменьшение НДФЛ на фиксированные платежи', '13.11.15', '5.01')
|
|
||||||
118112: ('fns', 'Возврат сумм ЕНС', '10.01.23', '5.02')
|
|
||||||
120627: ('fns', 'С-09-3-1 Сообщение о создании обособленного подразделения', '16.12.23', '5.05')
|
|
||||||
121754: ('fns', 'НД по ЕСХН', '01.01.21', '5.05')
|
|
||||||
121952: ('fns', 'НД по НДПИ', '01.01.25', '5.10')
|
|
||||||
120348: ('fns', '26.2-1 Уведомление о переходе на УСН', '02.11.12', '5.02')
|
|
||||||
126016: ('fns', 'Уведомление об освобождении от уплаты НДС', '01.01.25', '5.02')
|
|
||||||
117431: ('fns', 'Баланс государственного (муниципального) учреждения', '01.01.18', '5.06')
|
|
||||||
71563: ('fns', 'Перечень заявлений о ввозе товаров и уплате косвенных налогов', '01.01.15', '5.01')
|
|
||||||
117432: ('fns', 'Отчет о финансовых результатах деятельности учреждения', '01.01.18', '5.06')
|
|
||||||
120287: ('fns', 'Реестр документов, подтверждающих льготы по НДС', '02.12.20', '5.02')
|
|
||||||
120172: ('fns', 'Р26001 Прекращение деятельности ИП', '18.02.24', '5.03')
|
|
||||||
131129: ('fns', 'Возврат госпошлины', '10.01.23', '5.01')
|
|
||||||
120619: ('fns', 'С-09-3-2 Сообщение о закрытии обособленного подразделения', '31.08.11', '5.02')
|
|
||||||
120968: ('fns', '26.5-4 Заявление о прекращении деятельности по ПСН', '01.01.13', '5.02')
|
|
||||||
117430: ('fns', 'Баланс исполнения бюджета главного распорядителя', '01.01.18', '5.05')
|
|
||||||
106013: ('fns', 'Сведения о разрешениях на добычу водных биоресурсов', '26.02.24', '5.04')
|
|
||||||
7676: ('fns', '26.2-6 Уведомление об изменении объекта по УСН', '13.04.10', '5.02')
|
|
||||||
117553: ('fns', 'НД по акцизам на спирт', '01.01.25', '5.05')
|
|
||||||
46181: ('fns', 'Расчет регулярных платежей за пользование недрами', '01.01.22', '3.00004')
|
|
||||||
Loading…
Reference in New Issue