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

爬取Daraz分类时,如何回退循环并更新变量直至满足条件?

爬取Daraz Bangladesh嵌套分类时处理空一级子类的实现方案

问题场景

爬取https://www.daraz.com.bd/的父分类及嵌套子分类,采用三层循环结构:

  • 第一层循环:遍历所有主分类
  • 第二层循环:遍历主分类下的一级子类
  • 第三层循环:遍历一级子类下的二级子类

当前需求:当获取到的一级子类文本sub_cat_1为空或None时,递增CSS选择器中.Level_1_Category_No{num}的数字(比如从1改为2),更新一级子类列表后重新执行第二层循环。

实现步骤

  1. 在主分类循环内部初始化一级分类计数器level1_num,初始值为1,用于动态生成CSS选择器。
  2. 使用while循环包裹一级子类的获取与遍历逻辑,直到获取到有效的非空一级子类列表。
  3. 遍历一级子类时,若发现空文本项,立即递增计数器,重新获取一级子类列表并重置循环。
  4. 修正原代码中if条件的语法错误,用if not sub_cat_1:统一判断空文本或None的情况。

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time
import csv

driver = webdriver.Chrome()  # 需确保已配置ChromeDriver路径
driver.get("https://www.daraz.com.bd/")
time.sleep(10)
main_category = driver.find_elements(By.CSS_SELECTOR, '.lzd-site-menu-root-item span')

with open("all_category_subcat.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["Main Category", "Sub Category 1", "Sub Category 2"])

    for i in main_category:
        hover = ActionChains(driver).move_to_element(i)
        hover.perform()
        main_cat = i.text
        print(main_cat)

        level1_num = 1  # 初始化一级分类计数器
        while True:
            # 动态生成CSS选择器
            sub_category_one = driver.find_elements(By.CSS_SELECTOR, f".Level_1_Category_No{level1_num} .lzd-site-menu-sub-item > a span")
            has_empty = False  # 标记是否存在空文本项

            for y in sub_category_one:
                hover = ActionChains(driver).move_to_element(y)
                hover.perform()
                sub_cat_1 = y.text.strip()  # 去除首尾空白,避免空白字符被误判为非空
                print("--------------", sub_cat_1, "--------------")

                if not sub_cat_1:
                    has_empty = True
                    break  # 跳出当前一级子类循环,准备更新选择器

                # 若一级子类有效,继续爬取二级子类
                sub_category_two = driver.find_elements(By.CSS_SELECTOR, ".lzd-site-menu-grand-active span")
                for z in sub_category_two:
                    sub_cat_2 = z.text.strip()
                    print(sub_cat_2)
                    writer.writerow([main_cat, sub_cat_1, sub_cat_2])

            if not has_empty:
                break  # 没有空项,退出while循环,进入下一个主分类
            # 存在空项,递增计数器,重新获取一级子类列表
            level1_num += 1
            print(f"发现空一级子类,更新选择器为Level_1_Category_No{level1_num}")

driver.quit()

关键说明

  • 用f-string动态生成CSS选择器,实现计数器的替换
  • 加入strip()处理文本,避免空白字符导致的误判
  • 通过has_empty标记控制是否需要更新选择器重新循环
  • 用while True循环实现"更新-重试"的逻辑,直到获取到有效的一级子类列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:46:47