Python利用Beautiful Soup修改HTML/XML文档内容详解

凌晨两点半
凌晨两点半
发布时间:2026-10-13| 3人浏览过
原创

本文详细介绍Python中Beautiful Soup模块修改HTML/XML文档的方法。涵盖修改标签名称与属性、添加新标签、修改及删除字符串内容、移除节点以及使用wrap/unwrap等方法包裹或解包标签。通过具体代码示例,帮助开发者掌握动态修改网页内容的技巧。

前言

Beautiful Soup模块不仅支持文档的搜索与导航,还具备修改HTML或XML文档内容的能力。这包括添加或删除标签、更改标签名称、调整属性值以及修改文本内容等。本文将详细解析利用Beautiful Soup修改内容的具体方法,帮助读者深入理解其操作机制。

修改标签

以下示例沿用前文使用的HTML文档结构:

html_markup="""
 <div class="ecopyramid">
 <ul id="producers">
  <li class="producerlist">
  <div class="name">plants</div>
  <div class="number">100000</div>
  </li>
  <li class="producerlist">
  <div class="name">algae</div>
  <div class="number">100000</div>
  </li>
 </ul>
 </div>
 """

修改标签名称

soup = BeautifulSoup(html_markup,'lxml')
producer_entries = soup.ul
print producer_entries.name
producer_entries.name = "div"
print producer_entries.prettify()

修改标签属性值

# 修改标签属性
# 更新标签现有的属性值
producer_entries['id'] = "producers_new_value"
print producer_entries.prettify()
# 标签添加新的属性值
producer_entries['class'] = "newclass"
print producer_entries.prettify()
# 删除标签属性值
del producer_entries['class']
print producer_entries.prettify()

添加新的标签

可以通过new_tag方法创建新标签,随后利用append() 、insert()、insert_after()和insert_before()等方法将新标签插入到HTML树结构中。

例如,在HTML文档的ul标签内添加一个li标签。首先需生成新的li标签对象,再将其插入HTML树,并在该li标签内部插入相应的div标签。

# 添加新的标签
# new_tag 生成一个 tag 对象
new_li_tag = soup.new_tag("li")
# 标签对象添加属性的方法
new_atag = soup.new_tag("a",href="www.example.com" rel="external nofollow" )
new_li_tag.attrs = {'class':'producerlist'}
soup = BeautifulSoup(html_markup,'lxml')
producer_entries = soup.ul
# 使用 append() 方法添加到末尾
producer_entries.append(new_li_tag)
print producer_entries.prettify()
# 生成两个 div 标签,将其插入到 li 标签中
new_div_name_tag = soup.new_tag("div")
new_div_name_tag['class'] = "name"
new_div_number_tag = soup.new_tag("div")
new_div_number_tag["class"] = "number"
# 使用 insert() 方法指定位置插入
new_li_tag.insert(0,new_div_name_tag)
new_li_tag.insert(1,new_div_number_tag)
print new_li_tag.prettify()

修改字符串内容

修改字符串内容可借助new_string()、append()和insert() 等方法实现。

# 修改字符串内容
# 使用 .string 属性修改字符串内容
new_div_name_tag.string = 'new_div_name'
# 使用 .append() 方法添加字符串内容
new_div_name_tag.append("producer")
# 使用 soup 对象的 new_string() 方法生成字符串
new_string_toappend = soup.new_string("producer")
new_div_name_tag.append(new_string_toappend)
# 使用insert() 方法插入
new_string_toinsert = soup.new_string("10000")
new_div_number_tag.insert(0,new_string_toinsert)
print producer_entries.prettify()

删除标签节点

Beautiful Soup提供了decompose()和extract()两种方法来删除节点。

使用decompose()方法删除节点时,不仅会移除当前节点,还会一并删除其所有子节点。

而extract()方法则用于从HTML树中删除指定节点或字符串内容。

# 删除节点
third_producer = soup.find_all("li")[2]
# 使用 decompose() 方法删除 div 节点
div_name = third_producer.div
div_name.decompose()
print third_producer.prettify()
# 使用 extract() 方法删除节点
third_producer_removed = third_producer.extract()
print soup.prettify()

删除标签内容

若标签的子节点包含NavigableString或Tag对象,可使用clear()方法移除所有这些子节点,从而清空标签的.content属性。

修改内容的其他方法

除上述方法外,还有其他方式可用于修改文档内容。

insert_after()和insert_before()方法

这两个方法允许在标签或字符串的前后插入新的标签或字符串。它们仅接收一个参数,该参数必须是NavigableString对象或Tag对象。

replace_with()方法

该方法用于用新的标签或字符串内容替换原有的标签或字符串,接收一个标签或字符串作为输入参数。

wrap()和unwrap() 方法

wrap() 方法的作用是用另一个标签将指定标签或字符串包裹起来。

unwrap() 方法的功能与wrap()方法相反,用于移除包裹标签。

# wrap()方法
li_tags = soup.find_all('li')
for li in li_tags:
 new_div_tag = soup.new_tag('div')
 li.wrap(new_div_tag)
print soup.prettify()
# unwrap()方法
li_tags = soup.find_all("li")
for li in li_tags:
 li.div.unwrap()
print soup.prettify()

总结

以上内容涵盖了Python使用Beautiful Soup模块修改文档的全部关键方法。希望本文能为读者在学习或使用Python处理HTML/XML时提供帮助。如有任何疑问,欢迎留言交流,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。