抽出スキーマ
ページから何を取るかを書くための小さな記法。行の項目をまとめて保つ 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" }
}
}
}なぜこれがあるか。 もう一方のやり方 ―― 列ごとに配列を1本返す ―― は、 すべてのカードがすべての項目を持っている間だけ正しいです。1枚のカードに価格が無いと、その配列だけが1つ短くなり、それ以降の組み合わせが全部ずれます。そしてこれはエラーになりません。実在する商品名と、実在する価格が並んだ表ができあがります。ただし別々の商品のものです。後工程では検出できません。
list なら、欠けた項目はそのレコードの中の null になり、前後の行はずれません。
selector はCSSの段では必須、構造化データの段では無視されます。後者は Product を型で探し、ItemList → itemListElement → item の入れ子の中も辿ります ―― 商品一覧を公開しているページの多くがこの形だからです。
数値
価格は文字列で届きます。number は通貨記号・空白・両方の区切り記法を扱います。 ¥1,234,500 $1,299.00 1.299,00 € 9 800 円。
同じ区切り文字が2回以上出てきたら、それは桁区切りです。どの国の記法でも小数点が2つある表記は存在しません。 これは見た目より重要です。以前の実装は 1,234,500 をヨーロッパ式の小数と解釈して null を返していました。100万円を超える価格だけが静かに消え、それ以下は正常に解析されていました。
梯子
| 段 | 何をするか | 費用 |
|---|---|---|
css | 渡されたセレクタを読む | なし |
structured_data | サイトが既に公開している JSON-LD と OpenGraph を読む | なし |
llm | ページをモデルに説明させる | トークン |
段は列挙した順に走り、結果は統合されます。後の段は前の段が埋めなかった箇所だけを埋めます。["css", "structured_data"] を渡せば、モデルが呼ばれないことが保証されます。
空の配列は「値」ではなく「見つからなかった」として扱います。そうしないと、古くなったセレクタが0行を返した時点で梯子が止まり、同じページにある構造化データに出番が来ません。
最終更新