Beautiful Soup reemplaza <con & lt;

He encontrado el texto que quiero reemplazar, pero cuando imprimo una soup el formato cambia.

stuff here

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.