Фикс html_to_text (студия-ссылка в строке), BLOCK теги, схлопывание дорожек без студии, FlareSolverr-фолбэки
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dce219aeee
commit
96e5fa0d75
5 files changed
+67
-8
No files matched your search
+21
-4
@@ -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]:
|
||||
|
||||
Reference in new issue
Block a user