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

开发Checkout Bot:如何检测页面上禁用的Add to Cart按钮?

检测禁用的Add to Cart按钮并补充库存状态到Pandas DataFrame

问题背景

我正在开发一款Checkout Bot,需要用Pandas DataFrame输出商品标题及库存状态。目前已能正常打印商品标题,但区分商品是否缺货的唯一标识是禁用状态的Add to Cart按钮(所有商品位于同一页面)。

禁用按钮的HTML结构

<div class="StyledButtonWrapper-sc-1h3ts0h-0 gOOwkr">
  <button type="button" disabled="" class="StyledButton-sc-140xkaw-1 iAEEJh StyledButton-sc-1bveayl-0 gvJvME" data-test="a2c-Button">
    <div width="24" height="24" class="Icon-sc-1vrq823-0 iMdSTb">
      <svg width="32" height="32" viewBox="0 0 24 24">
        <path d="M20 20a2 2 0 1 1-2-2 2 2 0 0 1 2 2zM8 18a2 2 0 1 0 2 2 2 2 0 0 0-2-2zM21.5 4H5.72l-.56-1a2 2 0 0 0-1.74-1H2.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h.92l4.28 7.49a2.19 2.19 0 0 0 .27.35l-1.86 3.7a.77.77 0 0 0 0 .71l.22.38A.76.76 0 0 0 7 17h12.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5H8.62l1-2.09a2.74 2.74 0 0 0 .64.09h6.23A2.94 2.94 0 0 0 19 11.49l2.35-4.13A4.76 4.76 0 0 0 22 5v-.5a.5.5 0 0 0-.5-.5z"></path>
      </svg>
    </div>
  </button>
</div>

可用按钮的HTML结构

<div class="StyledButtonWrapper-sc-1h3ts0h-0 gOOwkr">
  <button type="button" class="StyledButton-sc-140xkaw-1 yIKjw StyledButton-sc-1bveayl-0 gvJvME" data-test="a2c-Button">
    <div width="24" height="24" class="Icon-sc-1vrq823-0 iMdSTb">
      <svg width="32" height="32" viewBox="0 0 24 24">
        <path d="M20 20a2 2 0 1 1-2-2 2 2 0 0 1 2 2zM8 18a2 2 0 1 0 2 2 2 2 0 0 0-2-2zM21.5 4H5.72l-.56-1a2 2 0 0 0-1.74-1H2.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h.92l4.28 7.49a2.19 2.19 0 0 0 .27.35l-1.86 3.7a.77.77 0 0 0 0 .71l.22.38A.76.76 0 0 0 7 17h12.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5H8.62l1-2.09a2.74 2.74 0 0 0 .64.09h6.23A2.94 2.94 0 0 0 19 11.49l2.35-4.13A4.76 4.76 0 0 0 22 5v-.5a.5.5 0 0 0-.5-.5z"></path>
      </svg>
    </div>
  </button>
</div>

现有可运行代码

items = soup.find('div', {'class': 'StyledRow-x4c83j-0 koBzMt'})

print(len(items.findAll('div', {'class': 'StyledCardWrapper-sc-1j5kbg6-0 cOnriV'})))
for item in items.findAll('div', {'class': 'StyledCardWrapper-sc-1j5kbg6-0 cOnriV'}):
    item_title = item.find('p', {'class': 'BaseTypo-sc-1jga2g7-0 izkVco StyledInfoTypo-sc-1jga2g7-1 doYUxh'})
    print(item_title.text)

解决方案

核心逻辑是在遍历每个商品卡片时,定位到对应的Add to Cart按钮,检查disabled属性是否存在,以此判断库存状态,最后将数据存入Pandas DataFrame。

修改后的完整代码

import pandas as pd

# 假设soup已经是解析好的BeautifulSoup对象
items_container = soup.find('div', {'class': 'StyledRow-x4c83j-0 koBzMt'})
items = items_container.findAll('div', {'class': 'StyledCardWrapper-sc-1j5kbg6-0 cOnriV'})

# 准备存储商品数据的列表
product_data = []

for item in items:
    # 获取商品标题
    item_title = item.find('p', {'class': 'BaseTypo-sc-1jga2g7-0 izkVco StyledInfoTypo-sc-1jga2g7-1 doYUxh'}).text
    # 定位Add to Cart按钮(用data-test属性更稳定,避免类名动态变化)
    add_to_cart_btn = item.find('button', {'data-test': 'a2c-Button'})
    # 判断库存状态:检查按钮是否有disabled属性
    stock_status = "缺货" if add_to_cart_btn.has_attr('disabled') else "有货"
    # 将数据添加到列表
    product_data.append({
        '商品标题': item_title,
        '库存状态': stock_status
    })

# 转换为Pandas DataFrame并打印
df = pd.DataFrame(product_data)
print(df)

关键说明

  • 使用data-test="a2c-Button"定位按钮比依赖类名更可靠,因为前端框架生成的类名(如StyledButton-sc-140xkaw-1)可能随版本更新变化
  • 通过has_attr('disabled')直接检查按钮是否包含禁用属性,这是判断状态的最直接方式
  • 先收集所有商品数据到列表,再一次性转换为DataFrame,比逐个添加更高效

内容的提问来源于stack exchange,提问作者totesbread

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:15:47