Python BeautifulSoup遍历同class div爬取价格重复如何解决
问题原因
你遇到的价格重复输出,是DOM嵌套匹配导致的:
- 初始代码先遍历所有class为
col的div,再在每个div下查找class为price__amount的span提取价格 - 目标页面的
col类div存在多层嵌套:通常商品列表的外层栅格、商品卡片本身、卡片内部的布局列都会复用col类名 - 同一个价格span会同时成为多层嵌套
coldiv的子节点,遍历每一层col的时候都会被匹配到,这就是你观察到同一价格最多重复3次的原因
修复方案
两种方案都可以实现无重复提取,优先选第一种,逻辑更简洁性能更好。
方案1:直接定位价格元素,跳过col遍历(推荐)
不要先匹配所有col再二次查找,直接锁定价格元素,从根源避免嵌套匹配问题:
from bs4 import BeautifulSoup import requests # 替换为你自己的请求逻辑、请求头、目标地址 resp = requests.get("目标页面地址", headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}) soup = BeautifulSoup(resp.text, "lxml") # 直接查找所有价格span,如果页面其他区域有同class的非商品价格,可以先锁定商品列表容器再查找 # 示例:商品列表容器id为product-list时,先执行 container = soup.find(id="product-list"),再在container下调用find_all price_tags = soup.find_all("span", class_="price__amount") price_list = [tag.get_text(strip=True) for tag in price_tags] # 打印验证结果 for price in price_list: print(price)
方案2:保留col遍历逻辑,加元素级去重
如果业务逻辑必须保留遍历col的步骤,不要用文本去重(会误删不同商品同价的结果),基于标签对象唯一标识去重:
col_divs = soup.find_all("div", class_="col") parsed_tag_ids = set() price_list = [] for div in col_divs: # 可选优化:跳过嵌套了其他col的外层div,减少无效遍历 if div.find("div", class_="col"): continue price_tag = div.find("span", class_="price__amount") # 只处理未提取过的价格标签 if price_tag and id(price_tag) not in parsed_tag_ids: parsed_tag_ids.add(id(price_tag)) price_list.append(price_tag.get_text(strip=True))
注意:禁止直接对提取后的价格字符串做集合/字典去重,当两个不同商品价格一致时,文本去重会错误删除合法的价格条目。
内容的提问来源于stack exchange,提问作者IKyouKnow
相关产品推荐
相关产品推荐

