He encontrado el texto que quiero reemplazar, pero cuando imprimo una soup
el formato cambia.
convierte en <div id="content">stuff here</div>
. ¿Cómo puedo preservar los datos? He intentado print(soup.encode(formatter="none"))
, pero eso produce el mismo formato incorrecto.
from bs4 import BeautifulSoup with open(index_file) as fp: soup = BeautifulSoup(fp,"html.parser") found = soup.find("div", {"id": "content"}) found.replace_with(data)
Cuando imprimo found
, obtengo el formato correcto:
>>> print(found) stuff
index_file
contenidos de index_file
están abajo:
Apples This is the Id of the page stuff here footer should go here
El objeto found
no es una cadena de Python, es una Tag
que tiene una buena representación de cadena. Puedes verificar esto haciendo
type(found)
Una Tag
es parte de la jerarquía de objetos que crea Beautiful Soup para que puedas interactuar con el HTML. Otro de esos objetos es NavigableString
. NavigableString
se parece mucho a una cadena, pero solo puede contener elementos que se incluirían en la parte del contenido del HTML.
Cuando tu lo hagas
found.replace_with('stuff here')
le está pidiendo a la Tag
que se reemplace con un NavigableString
que contenga ese texto literal. La única forma en que HTML puede mostrar esa cadena es escapar de todos los corchetes angulares, como está haciendo.
En lugar de ese desastre, es probable que desee conservar su Tag
y reemplazar solo su contenido:
found.string.replace_with('stuff here')
Observe que el reemplazo correcto no intenta sobrescribir las tags.
Cuando lo hace found.replace_with(...)
, el objeto al que se hace referencia por el nombre found
se reemplaza en la jerarquía principal. Sin embargo, el nombre found
sigue apuntando al mismo objeto obsoleto que antes. Es por eso que la impresión de soup
muestra la actualización, pero la impresión found
no lo hace.