BeautifulSoup:如何用元素标签替换元素中的值?

时间:2012-04-20 01:09:29

标签: python beautifulsoup

说我有这段HT​​ML:

<p>This text is my <a href="#">text</a><p>

如何用锚元素替换第一个“文本”,结果变为:

<p>This <a href="#">text</a> is my <a href="#">text</a><p>

我基本上想用一个Tag替换NavigableString中的子字符串。

2 个答案:

答案 0 :(得分:10)

您的问题分为两部分:

  1. 将单个NavigableString“This text is my”转换为NavigableString,Tag和另一个NavigableString。

  2. 使用三个新元素替换NavigableString“此文本是我的”。

  3. #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()thisis_my转换为普通的Unicode字符串。将它们转回NavigableString,以便它们可以作为元素返回树中:

    this = soup.new_string(this)
    is_my = soup.new_string(is_my)
    

    现在使用replace_with()insert_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>
    

答案 1 :(得分:3)

您可以获取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))