用 BeautifulSoup 中的另一个标签替换一个标签

Posted

技术标签:

【中文标题】用 BeautifulSoup 中的另一个标签替换一个标签【英文标题】:Replace a tag with another tag in BeautifulSoup 【发布时间】:2015-06-24 13:05:36 【问题描述】:

我正在尝试在 XML 文档中查找标签,并将其完全替换为新标签。我有我认为应该在下面工作的内容:

para = monograph.find('para', text='Some text.')
newpara = '<para>Some <emph type="bold">new</emph> text.</para>'
newpara = BeautifulSoup(newpara, 'xml')
para.replaceWith(newpara)

不幸的是,当我运行它时,我得到:

Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Python34\lib\site-packages\bs4\element.py", line 211, in replace_with
my_index = self.parent.index(self)
AttributeError: 'NoneType' object has no attribute 'index'

有什么建议吗?

【问题讨论】:

monograph.find('para', text='Some text.') 返回什么? para的值是一些文字。. 【参考方案1】:

您可以使用replaceWith() 来实现这一点,这是一种方法:

In [8]: from bs4 import BeautifulSoup

In [9]: tree = BeautifulSoup('<html><body><div>Foo</div><div>Bar</div><para>Some text.</para></body></html>', 'xml')

In [10]: newpara = '<para>Some <emph type="bold">new</emph> text.</para>'

In [11]: newpara = BeautifulSoup(newpara, 'xml')

# here I use newpara.para as a shortcut to get the <para> element
# as a new BeautifulSoup will include wrapping tags
In [12]: tree.find('para', text='Some text.').replaceWith(newpara.para)
Out[12]: <para>Some text.</para>

In [13]: print tree
<?xml version="1.0" encoding="utf-8"?>
<html><body><div>Foo</div><div>Bar</div><para>Some <emph type="bold">new</emph> text.</para></body></html>

希望这会有所帮助。

【讨论】:

谢谢,出于某种原因,像您一样将 find 和 replacewith 结合起来可以解决问题。我已经意识到我需要指定 newpara.para,但它仍然无法正常工作。无论如何,它现在可以工作了!

以上是关于用 BeautifulSoup 中的另一个标签替换一个标签的主要内容,如果未能解决你的问题,请参考以下文章

用包含相同文本的子标签替换beautifulsoup标签的标记文本的一种优雅方法

如何用 BeautifulSoup 更改标签名称?

用bash中的另一个文件替换整个文件

用文件中的另一个词替换特定词[关闭]

用bash中的另一个字符串替换结束括号

用R中的另一个值替换数据框多列中出现的数字