如何使用BeautifulSoup将#text子节点文本值作为元素进行编辑?
BeautifulSoup获取/修改p标签下文本节点和a标签的实现方案
你原先的代码无法获取文本节点,是因为
select()方法基于CSS选择器实现,而CSS选择器本身不支持选中纯文本节点,因此node.select("#text")不会返回任何结果。
BeautifulSoup中可以通过.contents属性获取标签的所有直接子节点,和PHP的childNodes功能完全对应。子节点分为两类:
NavigableString类型:对应PHP的#text节点,就是纯文本内容Tag类型:对应HTML标签节点,可通过.name属性获取标签名(比如a、span)
完整实现代码
首先导入依赖:
from bs4 import BeautifulSoup, NavigableString
业务逻辑代码:
# 待解析的HTML html = """ <body> <p>Some text 1 and this is <a href="">the link</p> <p>Some text 2 and this is <a href="">the another link</p> <p>Some text 3 and this is <a href="">the link 3</p> </body> """ soup = BeautifulSoup(html, "html.parser") # 取第一个p标签,和你原先逻辑一致 p_node = soup.select("p")[0] # 遍历p标签的所有直接子节点,对应PHP的childNodes遍历 for inner_node in p_node.contents: # 判断是否是纯文本节点,对应PHP的nodeName == "#text" if isinstance(inner_node, NavigableString): # 打印原文本 print(f"[{inner_node}] = ", end="") # 修改文本节点内容,用replace_with方法 inner_node.replace_with("My new link is ") # 打印修改后的内容 print(f'"{inner_node}"') # 判断是否是a标签,对应PHP的nodeName == "a" elif inner_node.name == "a": # 打印原a标签文本 print(f"[{inner_node.string}] = ", end="") # 修改a标签文本 inner_node.string = "here!" # 打印修改后的内容 print(f'"{inner_node.string}"') # 输出修改后的p标签验证结果 print("\n修改后的p标签内容:") print(p_node)
运行结果
和你要求的效果完全一致:
[Some text 1 and this is ] = "My new link is " [the link] = "here!" 修改后的p标签内容: <p>My new link is <a href="">here!</a></p>
补充说明
如果需要遍历所有层级的子节点(不只是直接子节点),可以把.contents换成.descendants属性即可。
内容的提问来源于stack exchange,提问作者user13728122
相关产品推荐
相关产品推荐

