# 淘宝/天猫选择器实测记录
> 实测日期:2026-08-11
> 页面:`detail.tmall.com/item.htm?id=960057430812`、`item.taobao.com/item.htm?id=1060253247160`
> 方法:反向扫描(dump 页面实际类名前缀,而非猜名字去查)
> 对应实现:`extension/src/profiles/taobao.ts`
---
## 1. 结论
**两站 DOM 完全一致**,同一套前端(`PageFramework--` / `tbpc-layout` / `keyInfo--` 骨架相同),一份 profile 覆盖淘宝与天猫。
类名形如 `mainTitle--HASH`,是 CSS Modules 产物:**语义前缀稳定,哈希后缀每次构建变**。因此选择器一律写 `[class*="前缀--"]`。
结尾的 `--` 不能省——它把父容器和子元素区分开:`generalParamsInfoItem--` 不会误命中 `generalParamsInfoItemTitle--`。
---
## 2. 确证的选择器
| 目标 | 选择器 | 实测证据 |
|---|---|---|
| 标题 | `[class*="mainTitle--"]` | n=2 imgs=0,纯文本节点。天猫「迷你特工队玩具X弗特…」淘宝「对插双刀流发光双刃剑…」 |
| 标题兜底 | `[class*="MainTitle--"]` `[class*="ItemTitle--"]` | 外层容器,天猫版带图标(imgs=2) |
| 价格 | `[class*="highlightPrice--"]` | 淘宝 `¥5.2`,天猫 `秒杀价¥27.72` |
| 价格兜底 | `[class*="priceWrap--"]` | 会带上「优惠前¥36.8」,故仅兜底 |
| 主图 | `[class*="picGallery--"] img` / `#picGalleryEle` | 天猫 imgs=6,淘宝 imgs=7 |
| 主图缩略 | `[class*="thumbnailPic--"]` | n=5/6 |
| SKU 容器 | `[class*="valueItem--"]` | **n=22 imgs=22**(天猫),每项恰含一张 img |
| SKU 规格名 | `[class*="valueItemText--"]` | 「特工x武器小【弗特】2种形态- 可变形」 |
| 参数项 | `[class*="generalParamsInfoItem--"]` | Title=「品牌」SubTitle=「劣狐狐(模玩)」 |
| 详情区 | `[class*="tabDetailWrap--"]` `[class*="detailInfo--"]` | 淘宝 imgs=7 |
---
## 3. 两个反直觉的点
### 3.1 淘宝 SKU 是真实 ``,不是 CSS 背景图
**与 1688 相反。** 探测数据:
```
valueItem n=22 imgs=22 ← 容器,每项含 1 张 img
valueItemImgWrap n=22 imgs=22 ← 图片包裹层
valueItemImg n=22 imgs=0 ← img 元素本身(querySelectorAll('img') 查自己得 0)
valueItemText n=22 imgs=0 ← 规格名文本
```
`imgs=0` 恰恰证明 `valueItemImg--` 就是 `
`。所以淘宝 profile **不能**用 `srcProps: ['backgroundImage']`(1688 必须用)。
引擎为此补了一段兜底:选择器命中容器且未取到 URL 时,往下找一层 `querySelector('img')`(见 `collector/image.ts`)。
### 3.2 主图组不设 minWidth
`picGallery--` 里同时有大图和缩略图,缩略图 `naturalWidth` 只有 60 左右。按 `minWidth: 200` 过滤会把主图**全部误杀**。
不过滤是安全的,因为 `toOriginalUrl()` 会把两种尺寸都还原成同一个原图 URL,`dedupeKey` 相同即自动去重。
---
## 4. 两个失效的既有假设
### 4.1 页面上没有 `