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?

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

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.


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')]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.