BeautifulSoup으로 스크립트 태그를 제거 할 수 있습니까?


93

BeautifulSoup을 사용하여 스크립트 태그와 모든 내용을 HTML에서 제거 할 수 있습니까? 아니면 정규식이나 다른 것을 사용해야합니까?

답변:


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 () for s in soup ( 'script')] 다음 [s.extract () for s in soup ( 'iframe')] 등 명령을 차례로 반복하면 작동합니다. ,하지만 그렇게 연결하면 [s.extract () for s in soup ( 'iframe', 'script')].
Ila

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

'script', 'img'등과 같은 잔해물을 제거하는 데 매우 유용합니다.


8
의 차이 decompose와는 extract입니다 후자의 반환 전 단지 그것을 파괴하는 반면, 제거 된 것. 따라서 이것은 질문에 대한 더 정확한 답이지만 다른 방법이 작동합니다.
Mike

1
Decompose는 스크립트 태그의 내용을 제거하지 않고 태그 만 제거합니다.
Roland Pihlakas

귀하의 의견에 모두 동의합니다. 그래서 remove내용에 대한 OP에 따라 정답을 말한 것입니다 . 종종 불필요한 태그 및 서식의 HTML을 정리하는 데 사용됩니다.
Abhishek Dujari

7
사실, 문서에 따라 "Tag.decompose 것은 () 트리에서 태그를 제거하고 완전히와 그 내용을 파괴 :" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel Apologies, 나는 내 의견에 언급을 추가하는 것을 잊었다 고 생각합니다.
jarcobi889

23

( 공식 문서 )에 명시된 것처럼 extract검색과 일치하는 모든 하위 트리를 제거 하는 방법을 사용할 수 있습니다 .

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]

특정 클래스의 태그를 제거하는 방법이 있습니까? 이름이 같은 모든 태그를 제거하지 않고 특정 클래스의 태그 블록 하나만 제거하고 싶습니다.
mulaixi

호출 extract할 특정 요소를 선택하기 만하면 됩니다. [x.extract() for x in a.select('span.className')]
Edvard Rejthar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.