Su pregunta tiene dos partes:
Al apagar la única NavigableString "Este texto es mi" en un NavigableString, una etiqueta, y otro NavigableString.
Reemplazo de la cadena NavigableString "Este texto es mi" con los tres elementos nuevos.
La respuesta al # 1 depende de su situación. Específicamente, depende de cómo determine qué parte del texto necesita vincularse. Usaré una expresión regular para encontrar la cadena "texto":
from bs4 import BeautifulSoup
data = '<p>This text is my <a href="#">text</a><p>'
soup = BeautifulSoup(data)
original_string = soup.p.contents[0]
print(original_string)
# "This text is my "
import re
this, text, is_my = re.compile("(text)").split(original_string)
Ahora para # 2. Esto no es tan fácil como podría ser, pero definitivamente es posible. En primer lugar, Turn text
en un Tag
que contiene el texto del enlace:
text_link = soup.new_tag("a", href="#")
text_link.string = text
re.split()
volvió this
y is_my
en cadenas Unicode ordinarios. Convertirlos de nuevo en NavigableString
s para que puedan volver a entrar en el árbol como elementos:
this = soup.new_string(this)
is_my = soup.new_string(is_my)
Ahora usa replace_with()
y insert_after
para reemplazar el viejo elemento con los tres nuevos elementos:
original_string.replace_with(this)
this.insert_after(text_link)
text_link.insert_after(is_my)
Ahora su árbol debe buscar la forma que desee a:
print(soup.p)
# <p>This <a href="#">text</a> is my <a href=""></a></p>