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
相关产品推荐
相关产品推荐

