Twoje pytanie ma dwie części:
obracając jeden NavigableString "Ten tekst jest mój" w NavigableString, znacznik, a inny NavigableString.
Wymiana NavigableString "Ten tekst jest mój" z trzema nowymi elementami.
Odpowiedź na nr 1 zależy od twojej sytuacji. W szczególności zależy to od tego, w jaki sposób ustalasz, która część tekstu wymaga połączenia. Użyję wyrażeń regularnych, aby znaleźć ciąg "tekst":
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)
Teraz dla # 2. To nie jest tak proste, jak mogłoby być, ale jest to zdecydowanie możliwe. Po pierwsze, Turn text
w Tag
zawierającego tekst linku:
text_link = soup.new_tag("a", href="#")
text_link.string = text
re.split()
okazało this
i is_my
w zwykłych ciągów Unicode. Włączyć je z powrotem do NavigableString
s, aby mogli wrócić do drzewa jako elementów:
this = soup.new_string(this)
is_my = soup.new_string(is_my)
Teraz użyj replace_with()
i insert_after
zastąpić starą elementu z trzech nowych elementów:
original_string.replace_with(this)
this.insert_after(text_link)
text_link.insert_after(is_my)
Teraz drzewo powinien wyglądać tak, jak chcesz:
print(soup.p)
# <p>This <a href="#">text</a> is my <a href=""></a></p>