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

