如何使用BeautifulSoup提取含指定class的i标签的span文本?
提取包含class="aaa"的标签的文本解决方案
方法1:通过目标标签反向定位父
直接找到所有class为aaa的<i>标签,再获取它们的父元素<span>的文本:
from bs4 import BeautifulSoup src = ''' <div class="row info"> <span><i class="aaa"></i>time 1</span> <span><i class="bbb"></i>place 1</span> <span><i class="ccc"></i>spot 1</span> </div>, <div class="row info"> <span><i class="aaa"></i>time 2</span> <span><i class="bbb"></i>place 2</span> <span><i class="ccc"></i>spot 2</span> </div>, <div class="row info"> <span><i class="aaa"></i>time 3</span> <span><i class="bbb"></i>place 3</span> <span><i class="ccc"></i>spot 3</span> ''' soup = BeautifulSoup(src, 'html.parser') # 定位所有class为aaa的i标签 target_i_tags = soup.find_all('i', class_='aaa') for i_tag in target_i_tags: # 获取父span的文本,strip()去除多余空白字符 print(i_tag.parent.text.strip())
方法2:使用CSS选择器直接定位目标
如果使用lxml解析器(需提前安装:pip install lxml),可以用:has选择器直接筛选包含<i class="aaa">的<span>:
from bs4 import BeautifulSoup soup = BeautifulSoup(src, 'lxml') # 用CSS选择器直接匹配包含i.aaa的span time_spans = soup.select('span:has(i.aaa)') for span in time_spans: print(span.text.strip())
若使用默认的html.parser,可通过子元素选择器定位后反向找父元素:
time_spans = soup.select('span > i.aaa') for i_tag in time_spans: print(i_tag.parent.text.strip())
方法3:遍历所有并筛选符合条件的元素
在你原有代码基础上,增加判断逻辑,检查每个<span>内部是否存在class为aaa的<i>标签:
from bs4 import BeautifulSoup soup = BeautifulSoup(src, 'html.parser') all_spans = soup.find_all('span') for span in all_spans: # 判断当前span是否包含class为aaa的i标签 if span.find('i', class_='aaa'): print(span.text.strip())
以上三种方法都能输出目标内容:time 1、time 2、time 3。
内容的提问来源于stack exchange,提问作者edoft
相关产品推荐
相关产品推荐

