parse_saby/cor_ func.py

105 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)