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

Python Selenium爬虫For循环遍历异常致库存数据错位求助

问题说明

使用Python结合Selenium编写网页爬虫,抓取产品型号、价格及库存数据。因网站结构限制,需点击产品下方按钮弹出窗口,查看各仓库库存并求和得到总库存。目前遇到问题:首个商品库存计算正确,但第二个商品复用首个结果,后续约900个商品库存全部错位(第n个显示第n+1个的库存)。相关代码片段如下:

stock_list =[]
stock_button=self.driver.find_elements(By.XPATH,'XYZ') ### - the xpath is to locate the button underneath each product (per the intro above)
for i in stock_button:
    i.click() ### - this pops-up the stock pop-up window 
    total_stock=0
    each_stock_line = self.driver.find_elements(By.XPATH,stock_xpath)   ### each line = warehouse
    for i in each_stock_line:
        total_stock=total_stock+int(i.get_attribute("innerHTML"))
    stock_list.append(total_stock)
    self.driver.find_element(By.XPATH,x_button).click() ### this is to close the pop-up window
代码缺陷分析
  • 循环变量重名覆盖:外层循环用i遍历按钮元素,内层循环又用i遍历库存行元素,直接覆盖了外层的i引用。当外层循环执行到第二次时,i已经变成内层循环的最后一个库存行元素,而非第二个按钮元素,导致后续点击操作完全错误,库存数据自然错位。
  • 无等待机制引发的数据同步问题:点击按钮弹窗后直接查找库存元素,弹窗可能还未加载完成,此时获取的仍是上一次弹窗的库存数据;关闭弹窗后立即点击下一个按钮,页面未恢复稳定,也会导致元素定位错误。
  • 元素定位稳定性不足:关闭弹窗时用find_element直接定位,若页面存在多个匹配该XPath的元素,可能误点其他元素;库存元素的XPath若未限定在弹窗范围内,也可能抓取到页面上的无关数据。
修复后的代码示例
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

stock_list = []
# 变量名改为复数,避免语义歧义
stock_buttons = self.driver.find_elements(By.XPATH, 'XYZ')
# 外层循环变量替换为btn,避免与内层冲突
for btn in stock_buttons:
    btn.click()
    # 等待弹窗内的库存元素加载完成
    WebDriverWait(self.driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, stock_xpath))
    )
    total_stock = 0
    each_stock_line = self.driver.find_elements(By.XPATH, stock_xpath)
    # 内层循环变量改为stock_item,避免覆盖外层
    for stock_item in each_stock_line:
        # 去除字符串首尾空白,避免转换整数报错
        stock_num = stock_item.get_attribute("innerHTML").strip()
        total_stock += int(stock_num)
    stock_list.append(total_stock)
    # 等待关闭按钮可点击后再操作
    close_btn = WebDriverWait(self.driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, x_button))
    )
    close_btn.click()
    # 等待弹窗完全消失,确保页面状态稳定后再处理下一个商品
    WebDriverWait(self.driver, 10).until(
        EC.invisibility_of_element_located((By.XPATH, stock_xpath))
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:01:01