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

Python使用BeautifulSoup检测无链接时如何正确实现IF判断返回True

问题原因

你的判断逻辑完全不触发的核心原因:
find_all('a') 只会返回页面DOM中实际存在的<a>标签对象。当商品售罄被移除后,页面里根本没有对应链接,该方法会返回空列表,此时for循环没有可遍历的元素,循环内部写的所有if/else逻辑都不会执行,自然不会有任何输出。

另外你之前尝试的几种判断写法本身也存在问题,具体区别如下:

  • link == "":仅判断变量值是否为空字符串,可用于识别属性值为空的场景,但无法判断None类型空值
  • link is "":错误写法,is用于判断两个对象内存地址是否完全一致,Python仅对短字符串、小整数做驻留优化,该写法判断结果不稳定,禁止使用
  • link is None:标准正确写法,用于判断变量是否为None空对象,是Python官方推荐的空值判断方式
  • link is NoneType:逻辑错误,NoneType是None所属的类型,None是该类型的实例,拿实例和类型做身份判断永远返回False

额外注意:不要用list作为变量名,会覆盖Python内置的列表类型,容易触发难以排查的报错。

正确实现代码

不需要遍历不存在的a标签,直接判断find_all返回的结果长度,即可确认是否存在有效商品链接,配合while True做定时轮询即可:

import time
from bs4 import BeautifulSoup
import requests

# 配置项,按实际需求修改
CHECK_INTERVAL = 60  # 轮询间隔,单位秒,建议不短于30秒避免被反爬拦截
TARGET_PAGE_URL = "替换为你要监控的店铺页面地址"
REQUEST_HEADERS = {
    "User-Agent": "替换为你自己浏览器的UA标识,降低被反爬拦截的概率"
}

while True:
    try:
        # 请求最新页面内容
        resp = requests.get(TARGET_PAGE_URL, headers=REQUEST_HEADERS, timeout=10)
        resp.raise_for_status()
        soup = BeautifulSoup(resp.content, "html5lib")

        # 定位商品列表容器
        list_grid = soup.find("div", class_="list-grid")
        if not list_grid:
            print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 未找到商品列表容器,页面结构可能已变动")
            time.sleep(CHECK_INTERVAL)
            continue

        # 提取所有有效商品链接,加href=True直接过滤无href属性的无效a标签
        valid_item_links = []
        for a_tag in list_grid.find_all("a", href=True):
            href = a_tag.get("href")
            # 按实际页面的商品链接特征过滤,比如商品链接都带/product/路径就加这个判断
            if href and "/product/" in href:
                valid_item_links.append(href)

        # 核心判断逻辑
        if not valid_item_links:
            print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 暂无在售商品,等待下次检测")
        else:
            print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 检测到在售商品,链接如下:")
            for link in valid_item_links:
                print(link)
            # 此处可加自定义提醒逻辑,比如弹窗、发通知等
            # 检测到商品后需要停止脚本就保留break,需要持续监控就注释掉break
            break

    except Exception as e:
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 检测出错:{str(e)},等待重试")
    
    # 等待间隔后进入下一轮检测
    time.sleep(CHECK_INTERVAL)
额外说明
  • 高频请求容易触发网站反爬机制,不要把轮询间隔设得太短,普通监控场景1-5分钟的间隔完全够用
  • 代码里加了异常捕获,网络波动、页面结构临时变动时不会直接崩溃,会等待下一轮重试
  • 商品链接的过滤规则需要你根据目标网站的实际链接特征调整,避免把导航链接、分页链接当成商品链接误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:51:22