假设我有这段 HTML:
<p>This text is my <a href="#">text</a><p>
如何用锚元素替换第一个“文本”,结果变为:
<p>This <a href="#">text</a> is my <a href="#">text</a><p>
我基本上想用标签替换 NavigableString 中的子字符串。
假设我有这段 HTML:
<p>This text is my <a href="#">text</a><p>
如何用锚元素替换第一个“文本”,结果变为:
<p>This <a href="#">text</a> is my <a href="#">text</a><p>
我基本上想用标签替换 NavigableString 中的子字符串。
你的问题有两个部分:
将单个 NavigableString“This text is my”转换为 NavigableString、Tag 和另一个 NavigableString。
用三个新元素替换 NavigableString “This text is my”。
#1的答案取决于您的情况。具体来说,这取决于您如何确定文本的哪一部分需要链接。我将使用正则表达式来查找字符串“text”:
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)
现在为#2。这并不容易,但绝对有可能。首先,text
变成一个Tag
包含链接文本的:
text_link = soup.new_tag("a", href="#")
text_link.string = text
re.split()
变成普通this
的is_my
Unicode字符串。将它们转回NavigableString
s 以便它们可以作为元素返回到树中:
this = soup.new_string(this)
is_my = soup.new_string(is_my)
现在使用replace_with()
andinsert_after
用三个新元素替换旧元素:
original_string.replace_with(this)
this.insert_after(text_link)
text_link.insert_after(is_my)
现在你的树应该看起来像你想要的那样:
print(soup.p)
# <p>This <a href="#">text</a> is my <a href=""></a></p>
您可以获取 NavigableString 的文本,对其进行修改,从修改后的文本构建新的对象模型,然后用此对象模型替换旧的 NavigableString:
data = '<p>This text is my <a href="#">text</a><p>'
soup = BeautifulSoup(data)
original_string = soup.p.contents[0]
new_text = unicode(original_string).replace(' text ', '<a href="#">text</a>')
original_string.replaceWith(BeautifulSoup(text))