BeautifulSoup очистка вложенных тегов

208
12 апреля 2022, 22:40

Всем привет!

Нужно взять из кода веб страницы только текст, который лежит в определенных тегах. Если в этих тегах, есть вложенные теги, их содержимое не нужно учитывать.

Например, мы имеем html код

<div><p>Нужный мне текст  <a href="#">Не нужная мне ссылка</a> <span>данный текст также мне не нужен</span> </p> ТЕКСТ</div>

Как мне взять, все что есть в теге DIV и P, удалив при этом вложенные теги?

Из оптимального, что получилось:

markup = '<div><p>Нужный мне текст  <a href="#">Не нужная мне ссылка</a> <span>данный текст также мне не нужен</span> </p> ТЕКСТ <a href="#">Не нужная мне ссылка 2</a><span>Спамный текст</span></div>'
root = BeautifulSoup(markup, 'html.parser')
div = root.select_one('div')
anchor_len = len ([ tag for tag in div.findAll() if tag.name == 'a'])
span_len = len ([ tag for tag in div.findAll() if tag.name == 'span'])
decomp_anchor = [ div.select_one('a').decompose() for i in range (anchor_len)]
decomp_span = [ div.select_one('span').decompose() for i in range (span_len)]
print(div.text)

Но насколько это оптимальный код? Просто decompose() удаляет первый тег в дереве, а нужно удалять все теги в дереве.

Answer 1

Используйте метод decompose для удаление тегов.

Пример:

from bs4 import BeautifulSoup
html = """
<div><p>Нужный мне текст  <a href="#">Не нужная мне ссылка</a> <span>данный текст также мне не нужен</span> </p> ТЕКСТ</div>
"""
root = BeautifulSoup(html, 'html.parser')
div = root.select_one('div')
div.select_one('a').decompose()
div.select_one('span').decompose()
print(root)
# <div><p>Нужный мне текст    </p> ТЕКСТ</div>

Если элементов несколько, то используйте метод select для получения списка элементов, после проходите в цикле по-элементно и у каждого элемента вызывайте decompose:

...
div = root.select_one('div')
for x in div.select('a'):
    x.decompose()
for x in div.select('span'):
    x.decompose()
print(root)
READ ALSO
Адаптивность. Как сделать чтобы блоки одностраничника в телефоне шли вертикально друг под другом?

Адаптивность. Как сделать чтобы блоки одностраничника в телефоне шли вертикально друг под другом?

как сделать чтобы блоки для телефона шли вертикально подряд друг под другом

105
Заполнение полей значениями из таблицы по нажатию на чекбокс

Заполнение полей значениями из таблицы по нажатию на чекбокс

Всем привет! Как можно сделать вывод информации из конкретной строки таблицы в поля ввода по нажатию на чекбокс? При том, что значение количества...

191
Wordpress как редактировать шаблон?

Wordpress как редактировать шаблон?

Wordpress как редактировать шаблон если нет в файлах footer header и тд html кода родительский шаблон проверил откуда тема берет код?

207
Игнорирует мой шрифт в CSS и берет шрифт Bootstapp

Игнорирует мой шрифт в CSS и берет шрифт Bootstapp

Хочу добавить шрифт OpenSans на свой сайт

195