This commit is contained in:
@@ -74,19 +74,26 @@ class UniversalParser(BaseParser):
|
|||||||
if parsed.netloc != base_domain:
|
if parsed.netloc != base_domain:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print("URL:", abs_url)
|
|
||||||
|
|
||||||
if not check_url(abs_url) and wp.check_error_url(abs_url):
|
if not check_url(abs_url) and wp.check_error_url(abs_url):
|
||||||
try:
|
try:
|
||||||
article = Article(abs_url)
|
article = Article(abs_url)
|
||||||
article.download()
|
article.download()
|
||||||
article.parse()
|
article.parse()
|
||||||
|
|
||||||
|
print("URL:", abs_url)
|
||||||
|
|
||||||
if len(article.text) > 200 and article.publish_date:
|
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)
|
response_text = gpt_response_message(str(article.text), self.promt)
|
||||||
# print(response_text)
|
print(response_text)
|
||||||
if response_text:
|
if response_text:
|
||||||
update_bd_and_create_document(
|
update_bd_and_create_document(
|
||||||
response_text=response_text,
|
response_text=response_text,
|
||||||
|
|||||||
@@ -9,6 +9,12 @@ from utils import logger
|
|||||||
import parser_bd as pbd
|
import parser_bd as pbd
|
||||||
|
|
||||||
|
|
||||||
|
# Обязательные поля для модели ParsedData
|
||||||
|
REQUIRED_FIELDS = [
|
||||||
|
'title', 'category', 'translation_text', 'short_text'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def update_bd_and_create_document(
|
def update_bd_and_create_document(
|
||||||
response_text: str,
|
response_text: str,
|
||||||
article_date: str,
|
article_date: str,
|
||||||
@@ -20,8 +26,6 @@ def update_bd_and_create_document(
|
|||||||
"""
|
"""
|
||||||
Обрабатывает ответ от GPT, сохраняет в БД и создаёт DOCX документ
|
Обрабатывает ответ от GPT, сохраняет в БД и создаёт DOCX документ
|
||||||
"""
|
"""
|
||||||
clean_response = ''
|
|
||||||
|
|
||||||
if not response_text:
|
if not response_text:
|
||||||
print(f"Пустой ответ от GPT для URL: {url}")
|
print(f"Пустой ответ от GPT для URL: {url}")
|
||||||
logger.info(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()
|
clean_response = response_text.strip().replace('```json', '').replace('```', '').strip()
|
||||||
data = json.loads(clean_response)
|
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']:
|
if data['category']:
|
||||||
|
# Добавляем системные поля
|
||||||
data['article_date'] = article_date
|
data['article_date'] = article_date
|
||||||
data['url'] = url
|
data['url'] = url
|
||||||
data['parsed_at'] = parsed_at
|
data['parsed_at'] = parsed_at
|
||||||
@@ -73,6 +90,11 @@ def update_bd_and_create_document(
|
|||||||
doc.save(doc_path)
|
doc.save(doc_path)
|
||||||
print(f"Сохранен документ: {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:
|
except Exception as ex:
|
||||||
print(f"Ошибка при обработке ответа GPT: {ex}")
|
print(f"Ошибка при обработке ответа GPT для URL {url}: {ex}")
|
||||||
logger.info(f"Ошибка при обработке ответа GPT: {ex}")
|
print(f"Сырой ответ: {response_text[:500]}")
|
||||||
|
logger.error(f"Ошибка при обработке ответа GPT для {url}: {ex}")
|
||||||
|
|||||||
Reference in New Issue
Block a user