Могу ли я удалить теги скриптов с помощью BeautifulSoup?

93

Можно ли удалить теги сценария и все их содержимое из HTML с помощью BeautifulSoup, или мне нужно использовать регулярные выражения или что-то еще?

Сэм
источник

Ответы:

164
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> for s in soup.select('script'):
>>>    s.extract()
>>> soup
baba
Фабио Динис
источник
Как лучше всего связать дополнительные теги, которые нужно удалить? Сейчас это работает, если я повторяю команду одну за другой, с [s.extract () для s в soup ('script')], затем [s.extract () для s в soup ('iframe')] и т. Д. , но не, если я соединю их так [s.extract () for s in soup ('iframe', 'script')].
Ила
8
@Ali Вам нужно будет использовать. [s.extract() for s in soup(['iframe', 'script'])]Обратите внимание, что для использования нескольких тегов параметр должен быть списком
Фабио Диниз
@ FábioDiniz Как бы извлечь что - то вроде: '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Это то же самое?
user2883071
2
После этой операции объект суп становится бесполезным, теги больше не обнаруживаются.
imrek
1
Это устарело, BeautifulSoup, похоже, теперь форматирует строку в html:<html><head></head><body><p>baba</p></body></html>
CloC
38

Обновленный ответ для тех, кому может понадобиться справиться в будущем: правильный ответ. decompose() Вы можете использовать разные способы, но decomposeработает на месте.

Пример использования:

soup = BeautifulSoup('<p>This is a slimy text and <i> I am slimer</i></p>')
soup.i.decompose()
print str(soup)
#prints '<p>This is a slimy text and</p>'

Довольно полезно избавиться от мусора, такого как «скрипт», «img» и так далее.

Абхишек Дуджари
источник
8
Разница между decomposeи extractв том, что последний возвращает то, что было удалено, а первый просто уничтожает его. Так что это более точный ответ на вопрос, но другие методы работают.
Майк
1
Decompose не удаляет содержимое тегов скрипта, он удаляет только теги.
Роланд
Я согласен с обоими вашими комментариями. Вот почему я сказал правильный ответ в соответствии с OP, который был для removeсодержимого. Часто используется для очистки HTML от ненужных тегов и форматирования.
Abhishek Dujari
7
Собственно, согласно документации: «Tag.decompose () удаляет тег из дерева, а затем полностью уничтожает его и его содержимое:» crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Извинения, я думаю, что забыл добавить упоминание в свой комментарий: я думаю, что отвечал Роланду Пихлакасу этим комментарием.
jarcobi889
23

Как указано в ( официальной документации ), вы можете использовать этот extractметод для удаления всего поддерева, соответствующего поиску.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Сантьяго Алессандри
источник
Есть ли способ удалить тег с определенным классом? Я хочу удалять не все теги с одинаковым именем, а только один блок тегов с определенным классом.
мулайси
Все, что вам нужно сделать, это выбрать определенные элементы для вызова extract.[x.extract() for x in a.select('span.className')]
Эдвард Рейтар,