You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python BeautifulSoup遍历同class div爬取价格重复如何解决

问题原因

你遇到的价格重复输出,是DOM嵌套匹配导致的:

  • 初始代码先遍历所有class为col的div,再在每个div下查找class为price__amount的span提取价格
  • 目标页面的col类div存在多层嵌套:通常商品列表的外层栅格、商品卡片本身、卡片内部的布局列都会复用col类名
  • 同一个价格span会同时成为多层嵌套col div的子节点,遍历每一层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 23:45:43