Estoy usando Python Beautiful Soup para analizar un archivo XML y escribirlo en un archivo diferente después de eliminar ciertas etiquetas. Pero el uso de sopa.prettify cambia otros espacios de nombres XML y nombres de atributos.
f = open('nuevo.xml',"w"); f.write(soup.prettify(formatter="xml")); f.cerrar();
Los cambios son los que se muestran en el ejemplo siguiente.
Archivo XML original.
<draw:control text:anchor-type="paragraph" draw:z-index="1" draw:style-name="gr1" draw:text-style-name="P2" svg:width="2.805cm" svg:height="1.853cm" svg:x="3.602cm" svg:y="0.824cm" draw:control="control2"/>
Nuevo archivo XML escrito desde sopa.prettify.
<draw:control draw:control="control2" draw:style-name="gr1" draw:text-style-name="P2" draw:z-index="1" svg:height="1.853cm" svg:width="2.805cm" svg:x="3.602cm" svg:y="0.824cm" text:anchor-type="paragraph"/>
Intenté agregar utf-8 para embellecer(). Pero es el mismo problema. ¿Existe algún otro método para eliminar una etiqueta en particular basándose en la búsqueda y mantener intactos todos los demás contenidos XML del archivo? Por favor recomiende.
Respuesta1
Considere utilizar xml.etree.ElementTree
un módulo nativo que implemente una API simple y eficiente para analizar y crear datos XML. Es más rápido, mejor, más fácil ypitónico.
Puedes eliminar un elemento en particular usando Element.remove()
.
Se da un ejemplo básico.aquí.
Pero si insistes en usarhermosasopa(Utiliza lxml
una versión mejorada del módulo py nativo), puedes
# beautifulstonesoup for XML parsing
from BeautifulSoup import BeautifulStoneSoup
xml_data = """
<draw:control text:anchor-type="paragraph" draw:z-index="1" draw:style-name="gr1" draw:text-style-name="P2" svg:width="2.805cm" svg:height="1.853cm" svg:x="3.602cm" svg:y="0.824cm" draw:control="control2"/>
"""
soup = BeautifulStoneSoup(xml_data)
print soup.prettify()
soup.find(<your tag/element).replaceWith(<whateveryouwant>)
También puedes utilizar un for
bucle para editar varios elementos similares.