Python利用Beautiful Soup修改HTML/XML文档内容详解
本文详细介绍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时提供帮助。如有任何疑问,欢迎留言交流,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













