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

BeautifulSoup中如何获取指定标签的同级字符串内容

问题原因

BeautifulSoup的Tag.string属性仅在标签满足以下两种情况之一时才会返回有效内容:

  • 标签本身无任何子标签,仅包含纯文本节点
  • 标签仅包含一个子标签,且该子标签本身可返回有效的.string值
    待解析的<strong>标签下同时存在<i>子标签、以及与i标签同级的独立文本节点,属于多子节点结构,不符合上述规则,因此直接调用.string会返回None。
正确获取方法

根据HTML结构,有几种稳定的实现方式:

方法1:定位i标签后取相邻文本节点(最精准,适配常规场景)

i标签和目标文本是直接相邻的兄弟节点,定位到i标签后直接取它的下一个兄弟节点即可,用strip()清理多余空白:

from bs4 import BeautifulSoup

# 解析初始化示例
html = '''<strong><i class="fas fa-id-card-alt"> </i> I want this text to be copied</strong>'''
soup = BeautifulSoup(html, "html.parser")

# 提取目标文本
target_text = soup.find("strong").find("i", class_="fas fa-id-card-alt").next_sibling.strip()

执行后target_text的值就是I want this text to be copied。

不建议直接用strong.get_text().strip()提取,这种方式会把strong下所有子标签里的文本(包括i标签内的内容)全部拼接,一旦i标签内存在其他文字,提取结果就会包含多余内容。

方法2:遍历直接子节点过滤文本(适配结构小幅变动场景)

如果后续i标签位置可能调整,可以遍历strong的所有直接子节点,过滤出非标签类型的文本节点:

from bs4 import NavigableString

strong_tag = soup.find("strong")
target_text = ""
for child in strong_tag.children:
    # 过滤标签节点,仅提取有效文本节点
    if isinstance(child, NavigableString):
        cleaned_text = child.strip()
        if cleaned_text:
            target_text = cleaned_text
            break

方法3:通过contents列表取节点(适合结构完全固定场景)

标签的所有直接子节点会按顺序存储在contents列表中,当前结构里索引0为i标签,索引1就是目标文本:

target_text = soup.find("strong").contents[1].strip()

注意:该方法强依赖节点顺序,如果后续strong标签内新增其他子节点,索引会失效。

内容的提问来源于stack exchange,提问作者Jamshid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:18:46