You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:27:02