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