Posso remover tags de script com BeautifulSoup?

90

As tags de script e todo o seu conteúdo podem ser removidos do HTML com o BeautifulSoup, ou devo usar Expressões regulares ou outra coisa?

Sam
fonte

Respostas:

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
Fábio Diniz
fonte
Qual é a melhor maneira de encadear tags adicionais a serem removidas? No momento, funciona se eu repetir o comando um após o outro, com [s.extract () para s na sopa ('script')] e depois [s.extract () para s na sopa ('iframe')] e assim por diante , mas não se eu os encadear assim [s.extract () for s in soup ('iframe', 'script')].
Ila
8
@Ali Você teria que usar [s.extract() for s in soup(['iframe', 'script'])]Observe que para usar várias tags, o parâmetro deve ser uma lista
Fábio Diniz
@ FábioDiniz Como eu extrairia algo como '<script class="blah">a</script>baba<script id="blahhhh">b</script>':? É o mesmo?
user2883071
2
O objeto sopa se torna inútil após esta operação, nenhuma etiqueta é encontrada.
imrek
1
Este está desatualizado, BeautifulSoup parece formatar a string para html agora:<html><head></head><body><p>baba</p></body></html>
CloC
37

Resposta atualizada para quem precisa para referência futura: A resposta correta é. decompose() Você pode usar maneiras diferentes, mas decomposefunciona no local.

Exemplo de uso:

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

Muito útil para se livrar de detritos como 'script', 'img' e assim por diante.

Abhishek Dujari
fonte
8
A diferença entre decomposee extracté que o último retorna a coisa que foi removida, enquanto o primeiro apenas o destrói. Portanto, esta é a resposta mais precisa para a pergunta, mas os outros métodos funcionam.
Mike
1
Decompor não remove o conteúdo das tags de script, apenas remove as tags.
Roland Pihlakas
Eu concordo com seus dois comentários. É por isso que eu disse a resposta correta de acordo com o OP que era para o removeconteúdo. Freqüentemente usado para limpar HTML de tags e formatação desnecessárias.
Abhishek Dujari
7
Na verdade, de acordo com a documentação: "Tag.decompose () remove uma tag da árvore, então a destrói completamente e seu conteúdo:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Desculpas, acho que esqueci de acrescentar uma menção em meu comentário: Eu acredito que estava respondendo a Roland Pihlakas com aquele comentário.
jarcobi889
22

Conforme declarado na ( documentação oficial ), você pode usar o extractmétodo para remover todas as subárvores que correspondem à pesquisa.

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