tests-passed

This commit is contained in:
2025-07-31 18:55:59 +03:00
parent b7abb8d8a1
commit e7230ba63c
126 changed files with 8326 additions and 3207 deletions

View File

@@ -2,66 +2,54 @@
Модуль для обработки HTML-фрагментов
"""
import trafilatura
from utils.logger import root_logger as logger
import re
from typing import Optional
def extract_text(html: str) -> str:
def extract_text(html_content: Optional[str]) -> str:
"""
Извлекает чистый текст из HTML
Извлекает текст из HTML с помощью регулярных выражений.
Args:
html: HTML строка
html_content (Optional[str]): HTML-строка для извлечения текста
Returns:
str: Извлеченный текст или пустая строка
"""
try:
result = trafilatura.extract(
html,
include_comments=False,
include_tables=True,
include_formatting=False,
favor_precision=True,
)
return result or ""
except Exception as e:
logger.error(f"Error extracting text: {e}")
if not html_content:
return ""
# Удаляем HTML-теги
text = re.sub(r"<[^>]+>", " ", html_content)
# Декодируем HTML-сущности
text = re.sub(r"&[a-zA-Z]+;", " ", text)
# Заменяем несколько пробелов на один
text = re.sub(r"\s+", " ", text).strip()
return text
def wrap_html_fragment(fragment: str) -> str:
"""
Оборачивает HTML-фрагмент в полную HTML-структуру для корректной обработки.
Оборачивает HTML-фрагмент в полный HTML-документ.
Args:
fragment: HTML-фрагмент для обработки
fragment (str): HTML-фрагмент
Returns:
str: Полный HTML-документ
Example:
>>> wrap_html_fragment("<p>Текст параграфа</p>")
'<!DOCTYPE html><html><head><meta charset="utf-8"></head><body><p>Текст параграфа</p></body></html>'
"""
if not fragment or not fragment.strip():
if "<!DOCTYPE html>" in fragment and "<html>" in fragment:
return fragment
# Проверяем, является ли контент полным HTML-документом
is_full_html = fragment.strip().startswith("<!DOCTYPE") or fragment.strip().startswith("<html")
# Если это фрагмент, оборачиваем его в полный HTML-документ
if not is_full_html:
return f"""<!DOCTYPE html>
return f"""<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
{fragment}
</body>
</html>"""
return fragment