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
相关产品推荐
相关产品推荐

