Фикс html_to_text (студия-ссылка в строке), BLOCK теги, схлопывание дорожек без студии, FlareSolverr-фолбэки

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-27 18:01:22 +07:00
1 parent dce219aeee
commit 96e5fa0d75
5 files changed
+67 -8

No files matched your search

+21 -4
View File
@@ -40,7 +40,7 @@ RE_TYPE_HINT = re.compile(
# корневые слова типов — для разбиения перечислений через запятую
# корни «голосности»: «Авторский, одноголосый» — одна дорожка (авторск — лишь
# уточнение), поэтому по запятым режем только перечисления голосностей
RE_TYPE_ROOT = re.compile(r"(?i)(дубл|многоголос|двухголос|одноголос)")
RE_TYPE_ROOT = re.compile(r"(?i)\b(дубл|многоголос|двухголос|одноголос)")
# разделители нескольких дорожек в одной строке (перед словом типа озвучки)
RE_SEP = re.compile(
@@ -50,15 +50,32 @@ RE_SEP = re.compile(
SELECTORS = ("div.post_body", "div[id^=post-text-]", ".postbody", "#tabs")
BLOCK_TAGS = ("p", "div", "tr", "li", "ul", "ol", "table", "hr", "h1", "h2", "h3",
"h4", "h5", "h6", "blockquote", "pre", "dt", "dd")
def _node_text(node) -> str:
"""Текст узла: перевод строки только на <br> и блочных тегах.
Инлайн-теги (<a>, <span>, <b>) строку не рвут: на rutracker имя студии —
ссылка внутри строки «Перевод 1: Профессиональный (…) <a>Студия</a>».
"""
for br in node.find_all("br"):
br.replace_with("\n")
for tag in node.find_all(BLOCK_TAGS):
tag.insert_before("\n")
tag.insert_after("\n")
return node.get_text("")
def html_to_text(html: str) -> str:
"""HTML -> текст: контейнер поста/вкладки описания либо весь документ."""
soup = BeautifulSoup(html, "lxml")
for sel in SELECTORS:
node = soup.select_one(sel)
if node and node.get_text(strip=True):
return node.get_text("\n")
body = soup.body or soup
return body.get_text("\n")
return _node_text(node)
return _node_text(soup.body or soup)
def _split_entries(body: str) -> list[str]: