BeautifulSoupでスクリプトタグを削除できますか?


90

スクリプトタグとそのすべてのコンテンツをBeautifulSoupを使用してHTMLから削除できますか、それとも正規表現などを使用する必要がありますか?

回答:


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()for s in soup( 'script')]、[s.extract()in s in soup( 'iframe')]などのように、コマンドを次々に繰り返すと機能します、しかしそのようにそれらをチェーンする場合はそうではありません[s。(extract()in s in soup( 'iframe'、 'script')]]。
Ila

8
@Aliあなたは利用しなければならない[s.extract() for s in soup(['iframe', 'script'])]複数のタグを使用するように、パラメータがリストされている必要があります
ファビオ・Diniz

@FábioDiniz次のようなものを抽出するにはどうすればよいです'<script class="blah">a</script>baba<script id="blahhhh">b</script>'か?同じですか?
user2883071 2015

2
この操作の後、スープオブジェクトは役に立たなくなり、タグはもう見つかりません。
imrek 2016年

1
これは古く、BeautifulSoupは文字列をhtmlにフォーマットしているようです:<html><head></head><body><p>baba</p></body></html>
CloC '21

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>'

「スクリプト」、「img」などの残骸を取り除くのに非常に便利です。


8
decomposeとは、extract後者の戻り前者だけがそれを破壊するのに対し、除去されたものということです。したがって、これは質問に対するより正確な答えですが、他の方法でも機能します。
Mike

1
分解では、スクリプトタグのコンテンツは削除されません。タグが削除されるだけです。
Roland Pihlakas 2017年

私はあなたの両方のコメントに同意します。そのため、removeコンテンツに対するOPの正解を述べました。多くの場合、不要なタグとフォーマットのHTMLのクリーニングに使用されます。
Abhishek Dujari 2017年

7
実際には、ドキュメントによると:「Tag.decompose()はツリーからタグを削除し、そのタグとその内容を完全に破棄します:」crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel謝罪、コメントに言及するのを忘れたと思います。RolandPihlakasにそのコメントで返信していたと思います。
jarcobi889

22

公式ドキュメント)に記載されているように、このextractメソッドを使用して、検索に一致するすべてのサブツリーを削除できます。

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.