# Crawl4AI 嵌套 JSON 提取教程：保留每个商品的规格归属与缺项

## 本轮实际范围

已真实运行 Crawl4AI 0.9.5 无 LLM 抽取，实际 JSON 通过字段和负例验收。

## 起步

```bash
python3 verify.py
```

## 1. 阅读四张商品卡

打开 products.html，逐张看商品 ID、价格和嵌套选项：台灯 2 个、笔记本 1 个、收纳袋 2 个、书立 0 个。价格缺失是未知，不写成 0 元。

```bash
python3 verify.py
```

## 2. 定义商品容器

schema.json 的 baseSelector 设为 .product，避免全页选择所有 .option 后丢失商品归属。字段从当前容器内部取值。

## 3. 用 nested_list 提取规格

为 options 设置 nested_list 与 .option，里面再读 size、color。保留每张商品卡自己的选项数组，不按总数量扁平拼接。

## 4. 以无 LLM 路线实际抓取

运行 run.py，AsyncWebCrawler 访问本地临时服务并应用 JsonCssExtractionStrategy。模型 schema 生成功能并未使用，也没有模型费用。

```bash
python3 run.py
```

## 5. 规范缺失值与空数组

对缺 price 的收纳袋保留 null，对书立保留 []。清洗后记录 normalize 规则，不为了通过验证凭空补一个规格或价格。

## 6. 按 ID 检查规格归属

verify.py 对照原始 products.json，检查每个 ID 的选项顺序与数量。negative.json 故意把台灯规格移给书立，必须被拒绝。

```bash
python3 verify.py --actual result.json
```

## 7. 给下游模型保留原字段

需要 AI 双语描述时提交完整结构与未知标记，要求不补价格。保留原 JSON，不让文案生成覆盖采集结果；本包未调用下游模型。

## 官方来源

https://docs.crawl4ai.com/extraction/no-llm-strategies/

## 提醒

参考文档、卡片、JSON和图片都明确标注人工或离线范围；没有实际调用的模型不提供假成功结果。占位配置不是可用凭据。
