Cambio de valor del elemento con BeautifulSoup vuelve elemento vacío
-
22-08-2019 - |
Pregunta
from BeautifulSoup import BeautifulStoneSoup
xml_data = """
<doc>
<test>test</test>
<foo:bar>Hello world!</foo:bar>
</doc>
"""
soup = BeautifulStoneSoup(xml_data)
print soup.prettify()
make = soup.find('foo:bar')
print make
# prints <foo:bar>Hello world!</foo:bar>
make.contents = ['Top of the world Ma!']
print make
# prints <foo:bar></foo:bar>
¿Cómo se cambia el contenido del elemento, en este caso el elemento en la variable "hacer", sin perder el contenido? Si me podría apuntar a otros módulos de Python wich puede modificar XML-documentos existentes, por favor hágamelo saber.
PS! BeautifulSoup es ideal para screenscraping y análisis de HTML y XML!
Solución
Salida documentación de la en replaceWith
. Esto funciona:
make.contents[0].replaceWith('Top of the world Ma!')
Otros consejos
Al usar la versión BeautifulSoup 4 (bs4
), se puede lograr el mismo por propiedad actualización string
directamente:
from bs4 import BeautifulSoup
xml_data = """
<doc>
<test>test</test>
<foo:bar>Hello world!</foo:bar>
<parent>Hello <child>world!</child></parent>
</doc>
"""
soup = BeautifulSoup(xml_data)
make = soup.find('foo:bar')
make.string = 'Top of the world Ma!'
print make
# prints <foo:bar>Top of the world Ma!</foo:bar>
Este enfoque funciona bien para el caso cuando el elemento contiene otros elementos, y que desea reemplazar todo el contenido con una nueva:
parent = soup.find('parent')
parent.string = 'Top of the world Ma!'
print parent
# prints <parent>Top of the world Ma!</parent>
me encontré con este lugar vieja pregunta en este momento, y la solución proporcionada no era muy adecuado para mí. La investigación adicional me lleva al enfoque anterior, y pensé que tal vez útil para compartir lo que terminé usando aquí.