Python爬取HTML时如何仅提取span直属文本排除嵌套span内容
外层span直属文本提取方法
场景说明
待解析HTML结构如下:
<span class="ms-2 d-flex"> <span class="d-none d-xl-block me-1"> mobile </span> ItsMobileNumber </span>
结构中外层span嵌套了一个子span,子span文本为mobile,需要提取的目标内容是外层span的直属文本ItsMobileNumber。
使用title.find("span").get_text()提取时,方法会递归获取所有层级的文本内容,返回结果同时包含mobile和目标文本,不符合提取要求。
具体实现
- 通用稳定方案:筛选直接文本节点
标签的contents属性会返回所有直属子节点,包含嵌套标签、文本节点、空白换行三类内容。导入BeautifulSoup的NavigableString类型判断节点属性,过滤掉标签节点和空白内容,就能拿到纯直属文本,该方法适配多段直属文本的场景,不受结构小幅变动影响:from bs4 import NavigableString outer_span = title.find("span", class_="ms-2 d-flex") target_text = "" for child in outer_span.contents: if isinstance(child, NavigableString): stripped = child.strip() if stripped: target_text = stripped print(target_text) # 输出 ItsMobileNumber - 简单直接方案:移除子标签后提取
先定位外层span,把其下所有直属嵌套标签全部移除,再调用get_text()即可拿到剩余的直属文本:outer_span = title.find("span", class_="ms-2 d-flex") # recursive=False 只找直属子标签,避免误删深层内容 for inner_tag in outer_span.find_all(recursive=False): inner_tag.extract() target_text = outer_span.get_text().strip() print(target_text) # 输出 ItsMobileNumber - 固定结构适配方案:取相邻兄弟节点
如果页面结构完全固定,目标文本刚好在内层span的紧邻后方,可以直接通过next_sibling属性取值,代码最简洁:inner_span = title.find("span", class_="d-none d-xl-block me-1") target_text = inner_span.next_sibling.strip() print(target_text) # 输出 ItsMobileNumber
注意:如果页面存在动态调整结构的可能,不建议使用第三种方案,优先选择前两种通用写法。
内容的提问来源于stack exchange,提问作者sajjad askari
相关产品推荐
相关产品推荐

