¿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?

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

¿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.


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')]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.