Задать вопрос
JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как удалить теги в beautifulsoup? Или почистить найденный тег от внутренних тегов, оставив внетеговое содержимое?

Скачиваю страницу при помощи requests.
r = requests.get(url)
html = r.text

Через beautifulsoup4 пытаюсь распарсить:
soup = BS(html, "lxml")
content = soup.find("div", class_="main_left").find("div", class_="content")
subject = content.find("h1", class_="news_title").text
text = content.find("div", class_="news_text")

text получается приблизительно с вот таким содержанием:
<div class="news_text">
\r\n\r\n\t\tЭто своего рода начальный абзац, как оказалось, 
он идёт вне каких-то тегов, просто такой вот абзац, 
иногда он на несколько строк, 
но он находиться вот прямо так сразу просто в диве.\r\n\r\n\t\t
<p>\r\n\r\n\t\tКакой-нибудь абзац с каким-нибудь текстом, 
обычно тоже на несколько строк\r\n\r\n\t\t</p>
<p>\r\n\r\n\t\tЕщё абзац, но уже содержащий какой-нибудь финт для рекламы 
типа <span></span>
<script>тут какой-нибудь скрипт на 5-7 строк</script>
\r\n\r\n\t\t</p>
<p>\r\n\r\n\t\tЕщё один абзац, тоже может содержать что-то лишнее 
или текст с <a href="https://toster.ru"><strong>какой-нибудь ссылкой</strong></a>, 
а потом продолжается ещё текст.\r\n\r\n\t\t</p>
</div>

Если я просто суповским методом попытаюсь всё сразу преобразовать в текст ( text.text ) , то во-первых теряются абзацы, а они мне нужны.
А во-вторых в этот текст попадает содержимое скриптов, и текст сразу не пригоден (при этом если я каждый абзац чищу, то скрипты не попадают в текст, но об этом ниже).
И вот например я могу легко взять теги p и почистить их в текст:
pre_abz = text.find_all('p')
abz = []
for a in pre_abz: abz.append(a.text.strip())

И да, действительно я получаю в абзацах всё, что находилось в тегах p и при этом всё чистенько, без "\r\n\r\n\t\t" , ссылок и скриптов.
Но мне нужен ещё и самый первый текст. Тот, который в моём примере начинается со слов Это своего рода начальный абзац...
Как его достать без использования регулярок, ума не приложу.
По сути дела, мне нужно убрать все дочерние теги в переменной text, но при этом чтобы осталось внетеговое содержимое.
Но я такого в документации не могу найти.
Пробовал сделать:
text.replace_with_children
на выходе получаю пустой див:
<div class="news_text"></div>
Будьте добры, подскажите, как этот текст красиво достать, что сделать?
С уважением.
  • Вопрос задан
  • 5438 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
JawsIk
@JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
В общем нашёл сам, через суповский contents

По сути концовка теперь стала такой:
abz = []
        first_text = text.contents[0]
        abz.append(str(first_text).strip())

        for a in text.find_all("p"):
            abz.append(a.text.strip())


но если кто-то знает решение проще, то пожалуйста напишите, я всегда рад изящным решениям.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
print(text.get_text())
Вот и все !
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы