Готовый рабочая версия

main
Лев 2025-07-24 11:24:49 +05:00
parent e6e7ebe66c
commit 8706583cd2
1 changed files with 77 additions and 34 deletions

View File

@ -6,17 +6,18 @@ import re
def parse_html(url=str): def parse_html(url=str):
""" """
Фунция принимает строку URL, Фунция принимает строку URL, выполняет запрос.
выполняет запрос, Создает и возращает объект BeautifulSoup(HTML).
создает и возращает объект BeautifulSoup(HTML).
""" """
# Запрос страницы # Запрос страницы
response = requests.get(url) response = requests.get(url)
# Проверка статуса страницы # Проверка статуса в ответе на запрос
if not(200 <= response.status_code <= 299): if not(200 <= response.status_code <= 299):
print("Ошибка при запросе:", response.status_code) # Повторный запрос
response = requests.get(url)
print("Ошибка при запросе: ", response.status_code)
return response.status_code return response.status_code
# Создание обьекта BeautifulSoup # Создание обьекта BeautifulSoup(HTML страница)
soup = BeautifulSoup(response.text, 'html.parser') soup = BeautifulSoup(response.text, 'html.parser')
return soup return soup
@ -29,23 +30,27 @@ def parse_date_report(url=str):
'date = 01.07.22' 'date = 01.07.22'
'id_date = 5.01' 'id_date = 5.01'
""" """
# HTML report
soup = parse_html(url) soup = parse_html(url)
# Если не удалось отправить запрос, ворзвращаем URL и код ошибки.
# Они будут занесы в файл.
if soup == int:
return url, soup
# Поиск в HTML строки ввида: 'Действующий формат (с 10.01.23) 5.01' # Поиск в HTML строки ввида: 'Действующий формат (с 10.01.23) 5.01'
div_element = soup.find('div', class_='controls-Dropdown__text') div_element = soup.find('div', class_='controls-Dropdown__text')
# Извлекаем текст из элемента # Извлекаем текст из элемента
text = div_element.get_text() text = div_element.get_text()
print(text, ' ',url) # Парсим нужные данные
#Парсим нужные данные # Уловия ловит: text = 'Действующий формат 02-04-2025 _2025_001'
date = '' if '_' in text:
id_date = ''
if ('_') in text:
regex = r'\w+\s\w+\s(\S+) (\S+)' regex = r'\w+\s\w+\s(\S+) (\S+)'
date, id_date = re.search(regex, text).groups() date, id_date = re.search(regex, text).groups()
return date, id_date
# Все остальные
else: else:
regex = r'(\d{2}\D\d{2}\D\d{2})(?:(?:.+)?\))? #?(\d+(?:\D\d+)?)' regex = r'(\d{2}\D\d{2}\D\d{2})(?:(?:.+)?\))? #?(\d+(?:\D\d+)?)'
date, id_date = re.search(regex, text).groups() date, id_date = re.search(regex, text).groups()
print('date: ', date, 'id: ', id_date) return date, id_date
return date, id_date
def parse_reports(soup=BeautifulSoup, def parse_reports(soup=BeautifulSoup,
report_title = str, report_title = str,
@ -55,24 +60,21 @@ def parse_reports(soup=BeautifulSoup,
Достаются все необходимые данные, возвращаются в ввиде словаря: Достаются все необходимые данные, возвращаются в ввиде словаря:
{106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')} {106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}
""" """
# Содрежит url всех report(не используется)
#list_report_url = []
result_dict_data = {} result_dict_data = {}
# Перебарает все URL, ищутся по тегу 'a' # Перебарает все URL, ищутся по тегу 'a'
for link in soup.find_all('a'): for link in soup.find_all('a'):
# Ищет по тегу: href # Ищет по тегу: href
href = link.get('href') href = link.get('href')
if f'{report_title}/' in href: if f'{report_title}/' in href:
# id записи # id report
id = href.rstrip('/').split('/')[-1] id = href.rstrip('/').split('/')[-1]
#URL записи #URL report
url_report = f'{url_formats}{href}' url_report = f'{url_formats}{href}'
#Добавление url в лист(не используется)
#list_report_url.append(url_title)
link = soup.find('a', href=href) link = soup.find('a', href=href)
# Имя записи # Name report
span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName") span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName")
# Передаем текущию запись цикла # Данные получены из url после парсинга
date, id_date = parse_date_report(url_report) date, id_date = parse_date_report(url_report)
# Добавление всех данных в итоговый словарь # Добавление всех данных в итоговый словарь
result_dict_data.update({id: (name_title, span.text, date, id_date)}) result_dict_data.update({id: (name_title, span.text, date, id_date)})
@ -84,49 +86,90 @@ def write_report_data(filename, dict_name = dict, name_title = str):
Сохраняем запись, каждая запись с новой строки: Сохраняем запись, каждая запись с новой строки:
'ключ: значение' 'ключ: значение'
'ключ: значение' 'ключ: значение'
...
""" """
dash = '-'*30 #Блок для красивого форлмения файла
# Вычисляем количество подчёркиваний слева и справа
def center_text():
"""
Функия парсит сколько нужно подчеркивания,
что бы центролизовать текст в строке с этими подчеркиваниями
Возвращает две строки одна для начало блока записей тайтал, вторая конца блока.
"""
start_str = f'START_{name_title}'
end_str = f'END_{name_title}'
dash = 100
list_result = []
# сначал вернеться dash_start, потом end_start.
for text in start_str, end_str:
remaining_space = dash - len(text)
left = remaining_space // 2
right = remaining_space - left # Чтобы учесть нечётную разницу
list_result.append('_' * left + text + '_' * right)
return list_result[:2]
dash_start, dash_end = center_text()
#Конец блока
#Запись в файл с красивым офрмление в виде нижнего подчеркивания
with open(filename, 'a', encoding='utf-8') as f: with open(filename, 'a', encoding='utf-8') as f:
f.write(f'\n{dash}START_{name_title}{dash}\n') f.write(f'\n{dash_start}\n')
for key, value in dict_name.items(): for key, value in dict_name.items():
str_k_v = f'{key}: {value}\n' str_k_v = f'{key}: {value}\n'
f.write(str_k_v) f.write(str_k_v)
f.write(f'{dash}END_{name_title}{dash}\n') f.write(f'{dash_end}\n')
def serth_title(): def search_title():
""" """
Функция ищет все тайтлы, Функция ищет все тайтлы,
возвращает лист сотоящий из: возвращает лист сотоящий из:
['/report/fns', ...] ['/report/fns', ...]
""" """
# url по которому в котором будет происходить поиск,
# Используется только в этой функции
url_format_report = 'https://formats.saby.ru/report' url_format_report = 'https://formats.saby.ru/report'
# Объект HTML
html = parse_html(url_format_report) html = parse_html(url_format_report)
# Если придет int(он же respons.status_code))
if html == int:
error_message = f'Ошибка при запросе {url_format_report}: {html}'
raise Exception(error_message)
# Лист в который будут заноситься тайтлы
list_reports = [] list_reports = []
# Перебераем все URL # Перебераем все URL
# Ищем все тэги 'a'
for link in html.find_all('a'): for link in html.find_all('a'):
# Ищет по тегу: href # Ищем по тегу: href
href = link.get('href') href = link.get('href')
#Проверям что href содержит: /report/{title}
if re.search(r'\/report\/(\w+)$', href): if re.search(r'\/report\/(\w+)$', href):
print('Cовпадение найдено: ', href)
list_reports.append(href) list_reports.append(href)
return list_reports return list_reports
# Имя файла в который будет записан результат кода # Имя файла в который будет записан результат кода
filename_save = 'ReportData.txt' filename_save = 'ReportData.txt'
#Удаляем старые записи, что бы довабить новые # Удаляем старые записи, что бы записать актульные
with open(filename_save, 'w') as f: with open(filename_save, 'w') as f:
#Файл перезаписывается в пустой # Файл перезаписывается и становится пустым
f.write('') f.write('')
# Лист имеет вид: ['/report/fns', '/report/sfr'...] # Лист имеет вид: ['/report/fns', '/report/sfr'...]
list_title = serth_title() list_title = search_title()
# Используется два раза, создал отдельную переменную
URL_FORMATS = 'https://formats.saby.ru' URL_FORMATS = 'https://formats.saby.ru'
"""
Цикл про бегается по каждому тайтлу.
Для всех записей(reports) выполняется запрос HTML страницы,
которая парситься в объект BeautifulSoup(HTML страница).
Из это обьекта достаются не боходимые данные,
которые записываются в текстовый файл.
"""
#report_title = '/report/fns'
for report_title in list_title: for report_title in list_title:
# Получаем имя тайтла через парсинг
name_title = report_title.rstrip('/').split('/')[-1] name_title = report_title.rstrip('/').split('/')[-1]
# URL на конкретный title
url_title = f'{URL_FORMATS}{report_title}' url_title = f'{URL_FORMATS}{report_title}'
# Объект HTML # Объект HTML, конкретного title
soup = parse_html(url_title) soup = parse_html(url_title)
# Словарь с нужными данными # Словарь с нужными данными
dict_result = parse_reports(soup, report_title, URL_FORMATS, name_title) dict_result = parse_reports(soup, report_title, URL_FORMATS, name_title)