¿Puedo eliminar las etiquetas de script con BeautifulSoup?

90

¿Se pueden eliminar las etiquetas de script y todo su contenido de HTML con BeautifulSoup, o tengo que usar expresiones regulares u otra cosa?

Sam
fuente

Respuestas:

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
fuente
¿Cuál es la mejor manera de encadenar etiquetas adicionales para eliminar? En este momento funciona si repito el comando uno tras otro, con [s.extract () para s en soup ('script')] luego [s.extract () para s en soup ('iframe')] y así sucesivamente , pero no si los encadeno así [s.extract () for s in soup ('iframe', 'script')].
Ila
8
@Ali Tendría que usar [s.extract() for s in soup(['iframe', 'script'])]Tenga en cuenta que para usar múltiples etiquetas, el parámetro debe ser una lista
Fábio Diniz
@ FábioDiniz ¿Cómo extraería algo como '<script class="blah">a</script>baba<script id="blahhhh">b</script>':? ¿Es lo mismo?
user2883071
2
El objeto de sopa se vuelve inútil después de esta operación, ya no se encuentran etiquetas.
imrek
1
Esto está desactualizado, BeautifulSoup parece formatear la cadena a html ahora:<html><head></head><body><p>baba</p></body></html>
CloC
37

Respuesta actualizada para aquellos que puedan necesitar una referencia futura: la respuesta correcta es. decompose() Puede utilizar diferentes formas, pero decomposefunciona en el lugar.

Uso de ejemplo:

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

Bastante útil para deshacerse de detritos como 'script', 'img' y así sucesivamente.

Abhishek Dujari
fuente
8
La diferencia entre decomposey extractes que este último devuelve lo que se eliminó, mientras que el primero simplemente lo destruye. Así que esta es la respuesta más precisa a la pregunta, pero los otros métodos funcionan.
Mike
1
Decompose no elimina el contenido de las etiquetas de secuencia de comandos, solo elimina las etiquetas.
Roland Pihlakas
Estoy de acuerdo con sus dos comentarios. Es por eso que dije la respuesta correcta según OP que era el removecontenido. A menudo se utiliza para limpiar HTML de etiquetas y formato innecesarios.
Abhishek Dujari
7
En realidad, de acuerdo con la documentación: "Tag.decompose () elimina una etiqueta del árbol, luego la destruye por completo y su contenido:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Disculpas, creo que olvidé agregar una mención en mi comentario: creo que estaba respondiendo a Roland Pihlakas con ese comentario.
jarcobi889
22

Como se indica en la ( documentación oficial ), puede usar el extractmétodo para eliminar todo el subárbol que coincida con la búsqueda.

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