【问题标题】:BeautifulSoup: How to replace value in an element with an element tag?BeautifulSoup:如何用元素标签替换元素中的值?
【发布时间】:2012-04-20 01:09:28
【问题描述】:

假设我有这段 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 中的子字符串。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您的问题分为两部分:

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

      2. 用三个新元素替换 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()thisis_my 转换为普通的Unicode 字符串。将它们转回NavigableStrings,这样它们就可以作为元素返回到树中:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多