From 36b544ad7e73b28961428c201fd392dc67474218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=91=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D0=B8=D1=81=D1=82?= Date: Wed, 29 Apr 2026 23:32:49 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parsers/universal.py | 15 +++++++++++---- services/document_builder.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/parsers/universal.py b/parsers/universal.py index 71df527..9a01c6f 100644 --- a/parsers/universal.py +++ b/parsers/universal.py @@ -74,19 +74,26 @@ class UniversalParser(BaseParser): if parsed.netloc != base_domain: continue - print("URL:", abs_url) + if not check_url(abs_url) and wp.check_error_url(abs_url): try: article = Article(abs_url) article.download() article.parse() - + + print("URL:", abs_url) + if len(article.text) > 200 and article.publish_date: - time_text = article.publish_date.strftime("%Y/%m/%d %H:%M:%S") + # Если дата публикации отсутствует - используем текущую + if article.publish_date: + time_text = article.publish_date.strftime("%Y/%m/%d %H:%M:%S") + else: + time_text = datetime.now().strftime("%Y/%m/%d %H:%M:%S") + print(f"Дата публикации отсутствует, используем текущую: {time_text}") response_text = gpt_response_message(str(article.text), self.promt) - # print(response_text) + print(response_text) if response_text: update_bd_and_create_document( response_text=response_text, diff --git a/services/document_builder.py b/services/document_builder.py index 343437e..eba3fdc 100644 --- a/services/document_builder.py +++ b/services/document_builder.py @@ -9,6 +9,12 @@ from utils import logger import parser_bd as pbd +# Обязательные поля для модели ParsedData +REQUIRED_FIELDS = [ + 'title', 'category', 'translation_text', 'short_text' +] + + def update_bd_and_create_document( response_text: str, article_date: str, @@ -20,8 +26,6 @@ def update_bd_and_create_document( """ Обрабатывает ответ от GPT, сохраняет в БД и создаёт DOCX документ """ - clean_response = '' - if not response_text: print(f"Пустой ответ от GPT для URL: {url}") logger.info(f"Пустой ответ от GPT для URL: {url}") @@ -31,7 +35,20 @@ def update_bd_and_create_document( clean_response = response_text.strip().replace('```json', '').replace('```', '').strip() data = json.loads(clean_response) + # Проверяем наличие обязательных полей от GPT + missing_fields = [f for f in REQUIRED_FIELDS if not data.get(f)] + if missing_fields: + print(f"Ответ GPT не содержит обязательных полей: {missing_fields} для URL: {url}") + logger.warning(f"Ответ GPT не содержит обязательных полей: {missing_fields} для URL: {url}") + print(f"Полученные данные: {data}") + return + + # Нормализация типов: category может приходить как list, а ожидается str + if isinstance(data.get('category'), list): + data['category'] = ', '.join(data['category']) + if data['category']: + # Добавляем системные поля data['article_date'] = article_date data['url'] = url data['parsed_at'] = parsed_at @@ -73,6 +90,11 @@ def update_bd_and_create_document( doc.save(doc_path) print(f"Сохранен документ: {doc_path}") + except json.JSONDecodeError as ex: + print(f"Ошибка парсинга JSON от GPT для URL {url}: {ex}") + print(f"Сырой ответ: {response_text[:500]}") + logger.error(f"JSON decode error для {url}: {ex}") except Exception as ex: - print(f"Ошибка при обработке ответа GPT: {ex}") - logger.info(f"Ошибка при обработке ответа GPT: {ex}") + print(f"Ошибка при обработке ответа GPT для URL {url}: {ex}") + print(f"Сырой ответ: {response_text[:500]}") + logger.error(f"Ошибка при обработке ответа GPT для {url}: {ex}")