抽取模式
描述从页面上取什么的一套小型写法,包含把一行的各字段绑在一起的 list 类型。
单个值
{ "title": "string", "price": "number", "in_stock": "boolean" }类型有 string、number、boolean、string[]、number[]。只写类型时,结构化数据层会按名称去找该字段。要精确指定就给一个选择器:
{ "price": { "type": "number", "selector": ".price", "attribute": "content" } }列表
列表页是「行」,不是「列」。 请照这样去要它。
{
"listings": {
"type": "list",
"selector": ".product-card",
"limit": 100,
"item": {
"name": { "type": "string", "selector": "h2 a" },
"price": { "type": "number", "selector": ".price" },
"url": { "type": "string", "selector": "h2 a", "attribute": "href" }
}
}
}为什么需要它。 另一种做法 —— 每列返回一个数组 —— 只在每张卡片都带有全部字段时才是对的。 一张卡片缺了价格,那一个数组就短一位,之后所有的配对全部错位。而这不会报错:你会得到一张由真实商品名和真实价格组成的表格,只不过它们分属不同的商品。下游无法检测出来。
用 list,缺失的字段是该条记录内部的一个 null,前后各行依然对齐。
selector 在 CSS 层是必需的,在结构化数据层会被忽略 —— 后者按类型查找 Product 节点,包括嵌套在 ItemList → itemListElement → item 里的, 因为大多数发布商品列表的页面正是这个结构。
数值
价格以文本形式到达。number 能处理货币符号、空格,以及两种分隔符习惯: ¥1,234,500、$1,299.00、1.299,00 €、9 800 円。
同一个分隔符出现两次以上,它就是千分位 —— 任何地区的写法都不存在两个小数点。 这比看上去更重要:早前的实现把 1,234,500 当作欧式小数并返回 null, 结果是一百万以上的价格全部悄悄消失,而低于这个数的都正常解析。
阶梯
| 层 | 做什么 | 费用 |
|---|---|---|
css | 读取你提供的选择器 | 无 |
structured_data | 读取站点已经公布的 JSON-LD 与 OpenGraph | 无 |
llm | 把页面描述给模型 | token |
各层按你列出的顺序执行,结果会合并:后一层只填补前面留空的部分。 传入 ["css", "structured_data"],即可保证不会调用模型。
空数组算作「没找到」,而不是一个值。 否则一个失效的选择器返回 0 行就会让阶梯停下,同一页上的结构化数据永远轮不到。
最后更新