BeautifulSoup如何按class后缀数值范围爬取目标div元素
BeautifulSoup按类名数字范围筛选元素实现方案
CSS原生属性选择器仅支持字符串匹配,不支持数值范围判断,无法直接在选择器规则里完成数字大小筛选,你可以根据场景选择以下两种方案实现需求:
方案1:枚举匹配(适合小范围数值筛选)
当你要筛选的数值区间很小(比如当前需求的5-10),直接在选择器里枚举所有符合要求的类名即可,代码最简洁:
# 兼容元素class包含多个类名的场景 target_divs = soup.select( 'div[class*="item-5"],' 'div[class*="item-6"],' 'div[class*="item-7"],' 'div[class*="item-8"],' 'div[class*="item-9"],' 'div[class*="item-10"]' )
如果你的目标div只有item-x这一个类名,可以用性能更好的类选择器写法:
target_divs = soup.select('div.item-5, div.item-6, div.item-7, div.item-8, div.item-9, div.item-10')
方案2:粗筛+后置逻辑过滤(适合大范围/复杂规则筛选)
如果筛选区间很大(比如需要筛选5-100区间的元素),枚举选择器维护成本很高,推荐先选出所有带item-前缀的div,再通过代码提取数字判断范围:
import re # 第一步:粗筛所有带item-类的div all_item_divs = soup.select('div[class*="item-"]') target_divs = [] for div in all_item_divs: # 遍历元素的所有class,提取item-后面的数字 for cls in div.get('class', []): num_match = re.fullmatch(r'item-(\d+)', cls) if num_match: item_num = int(num_match.group(1)) # 判断数字是否在目标区间 if 5 <= item_num <= 10: target_divs.append(div) break
这种写法只需要修改if判断里的区间数值,就能适配任意范围的筛选需求,不会出现误匹配item-100这类不符合要求元素的问题。
内容的提问来源于stack exchange,提问作者Gagak
相关产品推荐
相关产品推荐

