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

使用Python与BeautifulSoup实现添加购物车按钮检测的问题求助

问题:使用BeautifulSoup检测「Add to Cart」按钮并实现循环通知

我想要使用BeautifulSoup爬取指定网站,当检测到「Add to Cart」按钮时进行通知,未检测到则循环执行。目前代码编写初期遇到问题无法正常运行,恳请技术协助。

目标网页元素代码

<div class="carting">
  <button type="button" class="btn addtocart" data-id="45399" data-cart-qty="0" data-title="Walking Dead       Compendium TP Vol 03">
     <img src="/images/cart.png" alt="Add to Cart">
      " Add to Cart"
    </button>
  <button type="button" class="btn addtolist" data-id="45399" data-code="AUG150497D" data-title="random title ">…</button>
</div>

原错误脚本

from bs4 import BeautifulSoup
import requests

def main():
    requests.get("https://www.websiteurl.com")
    doc = BeautifulSoup(result, "html.parser")
    if doc.find_all(class_='btn addtocart', text=" Add to Cart "):
        print("Stuff")

问题分析与修正脚本

原脚本存在的问题

  1. requests.get的结果未赋值给变量,直接使用result会触发NameError
  2. text参数匹配过于严格:按钮内文本包含引号,且存在空格/换行干扰,无法精准匹配
  3. 缺少循环逻辑,未实现"未检测到则重复执行"的需求
  4. 未调用main()函数,代码无法执行
  5. 无异常处理,请求失败时会直接崩溃

修正后的脚本

from bs4 import BeautifulSoup
import requests
import time

def check_add_to_cart():
    url = "https://www.websiteurl.com"
    try:
        # 发送请求并检查响应状态
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        
        doc = BeautifulSoup(response.text, "html.parser")
        # 通过class定位按钮,再检查文本内容(去除多余空格和引号)
        add_cart_btn = doc.find(class_="btn addtocart")
        
        if add_cart_btn:
            # 提取按钮文本并清理格式
            btn_text = add_cart_btn.get_text(strip=True).strip('"')
            if btn_text == "Add to Cart":
                print("检测到「Add to Cart」按钮!")
                # 这里可以添加通知逻辑,比如弹窗、发邮件等
                return True
        print("未检测到按钮,继续等待...")
        return False
        
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return False

def main():
    # 设置循环间隔(单位:秒,避免频繁请求被网站拦截)
    check_interval = 60
    while True:
        if check_add_to_cart():
            break  # 检测到按钮后退出循环
        time.sleep(check_interval)

if __name__ == "__main__":
    main()

关键修改说明

  • 保存requests.get的响应结果到response变量,通过response.text传入BeautifulSoup
  • 使用find()代替find_all(),只需定位单个按钮即可
  • 用get_text(strip=True)清理文本中的空格、换行,再去除引号后匹配
  • 添加循环逻辑,通过time.sleep()设置检测间隔,避免触发网站反爬机制
  • 增加异常捕获,处理请求超时、连接失败等情况
  • 规范函数调用逻辑,通过if __name__ == "__main__"执行主函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:40:48