tests-passed
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user