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

Python用BeautifulSoup做库存监控发邮件报IndexError如何修复

问题修复方案

报错原因

当商品处于有货状态时,页面不存在「Sold Out」文本,soup.find_all(text="Sold Out")会返回空列表,直接访问soldout[0]触发索引越界错误。

修正后代码(同时满足两个需求)

既优化了检测逻辑避免报错,也实现了无Sold Out标识时自动发送带对应商品链接的提醒邮件:

import smtplib
from bs4 import BeautifulSoup
import requests

# 替换为你实际的商品URL列表
url_list = [url1, url2, url3, url4]
# 用于存放有货的商品链接
in_stock_urls = []

for pg in url_list:
    page = requests.get(pg)
    soup = BeautifulSoup(page.content, "html.parser")
    soldout = soup.find_all(text="Sold Out")
    # 判断是否存在售罄标识
    if len(soldout) == 0:
        # 无售罄标识判定为有货,加入待提醒列表
        in_stock_urls.append(pg)
        continue
    # 售罄状态正常打印
    parent = soldout[0].parent
    print(parent.string)

# 存在有货商品时发送邮件
if in_stock_urls:
    gmail_user = '你的邮箱地址'
    gmail_password = '你的邮箱授权码'

    sent_from = gmail_user
    to = ['接收提醒的邮箱地址']
    subject = '商品补货提醒'
    # 拼接所有有货商品链接到邮件正文
    body = '以下商品当前有货:\n' + '\n'.join(in_stock_urls)

    email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(to), subject, body)

    try:
        smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        smtp_server.ehlo()
        smtp_server.login(gmail_user, gmail_password)
        smtp_server.sendmail(sent_from, to, email_text.encode('utf-8'))
        smtp_server.close()
        print("邮件发送成功!")
    except Exception as ex:
        print("邮件发送出错:", ex)

主要修改点

  • 新增有货链接收集逻辑,检测到无「Sold Out」标识时直接判定为有货,不再访问空列表索引,避免报错
  • 邮件正文自动拼接所有检测到的有货商品链接,无需手动修改
  • 仅当存在有货商品时才触发邮件发送逻辑,不会发送空提醒

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:00