Чи можу я видалити теги сценарію за допомогою BeautifulSoup?


90

Чи можна теги скриптів та весь їх вміст видалити з HTML за допомогою BeautifulSoup, чи мені потрібно використовувати регулярні вирази чи щось інше?

Відповіді:


160
>>> 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 в супі ('сценарій')], потім [s.extract () для s в супі ('iframe')] і так далі , але ні, якщо я зв’язую їх так [s.extract () для s в супі ('iframe', 'script')].
Іла,

8
@Ali Вам довелося б [s.extract() for s in soup(['iframe', 'script'])]зауважити, що для використання декількох тегів параметром повинен бути список
Fábio Diniz

@ FábioDiniz Як би я видобув щось на зразок '<script class="blah">a</script>baba<script id="blahhhh">b</script>':? Це те саме?
користувач2883071,

2
Суп-предмет стає марним після цієї операції, теги вже не знайдені.
імрек

1
Це застаріло, здається, BeautifulSoup форматує рядок у форматі html зараз:<html><head></head><body><p>baba</p></body></html>
CloC

37

Оновлена ​​відповідь для тих, кому може знадобитися подальша довідка: Правильна відповідь. 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>'

Дуже корисно позбутися такого детриту, як 'script', 'img' тощо.


8
Різниця між decomposeта extractполягає в тому, що останній повертає вилучену річ, тоді як перший просто знищує її. Отже, це більш точна відповідь на запитання, але інші методи працюють.
Mike

1
Розкладання не видаляє вміст тегів сценарію, воно лише видаляє теги.
Роланд Піхлакас

Я згоден з обома Вашими коментарями. Ось чому я сказав правильну відповідь відповідно до OP, який стосувався removeзмісту. Часто використовується для очищення HTML непотрібних тегів та форматування.
Абхішек Дуджарі

7
Власне, згідно з документацією: "Tag.decompose () видаляє тег з дерева, а потім повністю знищує його та його вміст:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889,

1
@Vangel Вибачення, я думаю, що забув додати згадку у своєму коментарі: я вважаю, що відповів Роланду Піхлакасу цим коментарем.
jarcobi889

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.