scrape-analyze-page について
scrape-analyze-page は、保存済み Web ページの HTML から構造化フィールドを抽出するスキルです。スキーマに沿った抽出や一覧ページの反復項目に対応し、クリーニング済み HTML とメタデータを使って結果を JSON に保存できます。
主な機能
- 01クリーニング済み HTML とメタデータから抽出
- 02JSON Schema に沿った抽出
- 03厳密モードと一覧ページモード
- 04結果を JSON または YAML で保存
- 05長いフィールド値の要約
活用シーン
- 01商品詳細ページから属性を構造化して抽出
- 02一覧ページから繰り返し項目を収集
- 03指定スキーマに合わせてページデータを整理
- 04抽出したページ項目を JSON ファイルに保存
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ zytedata/ skills --skill scrape-analyze-pageインストール後、Claude Code で/scrape-analyze-pageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/clean_html.pyextract_metadata.pysummarize.py詳細
このファイルは134行です。すべて読んでください。
以下の SKILL_DIR は、このファイルが格納されているディレクトリの絶対パスを表します。
ページから構造化データを抽出します。保存済みの HTML を受け取り、利用可能なすべてのフィールドを特定して値を抽出してください。
入力
ユーザープロンプトは $ARGUMENTS です。そこから次の情報を抽出してください。
- 保存済み HTML ファイルのパス。例:
product1.html。これを分析します。指定されていない場合は、処理を続行しないでください。 - 出力ファイルのパス。例:
product1.json。指定されている場合は、構造化した分析結果をここに保存します。 - データ型の仕様ファイル
spec.jsonのパス。指定されている場合は、スキーマのフィールド名、説明、例に基づいて抽出します。 - スキーマが指定されている場合、スキーマに記載されたフィールドのみを厳密に抽出するかどうか。厳密な抽出を求められた場合は、スキーマのフィールドのみを抽出し、追加のフィールドは含めません。
--list-mode:指定されている場合、ページは一覧ページです。単一のオブジェクトではなく、繰り返し表示されるすべての項目(例:各商品カード)を配列として抽出します。
処理手順
1. ページをクリーニングして読み込む
この1ページだけを処理してください。 他のページの分析ファイルを読んだり、比較したりしないでください。
.scrape/.work/ はオーケストレーターおよび同時実行中の他のエージェントと共有されています。いついかなる場合も、その配下のファイルを削除したり「クリーンアップ」したりしないでください。完了後も、中間ファイルはそのまま残してください。
HTML をクリーニングしてメタデータを抽出し、出力を作業ディレクトリに保存してください。ファイル名の衝突を避けるため、ファイル名のベースには {page_id}.{html_variant} を使用してください。
uv run --python 3.14 SKILL_DIR/scripts/clean_html.py PAGE.html -l1 -o .scrape/.work/analysis/{page_id}.{html_variant}.cleaned.html
uv run --python 3.14 SKILL_DIR/scripts/extract_metadata.py PAGE.html -u PAGE_URL -o .scrape/.work/analysis/{page_id}.{html_variant}.metadata.json
クリーニング済み HTML とメタデータ JSON のみを読み込んでください(元の HTML は読み込まないでください)。ページに構造化データがない場合、メタデータは空の {} でもかまいません。
2. フィールドを抽出する
重要:元の HTML ファイル(PAGE.html)は、部分的であっても、Bash などのツールを介してであっても、決して読み込まないでください。HTML ソースとして使用するのは、ステップ 1 で生成したクリーニング済み HTML 出力のみです。
クリーニング済み HTML とメタデータの両方をデータソースとして使用してください。メタデータ(特に JSON-LD)には、HTML 上に表示される値よりも整理され、情報が充実した値が含まれていることがよくあります。たとえば、表示された「$29.99」より構造化された price/priceCurrency、レビュー数を含む aggregateRating、構造化オブジェクトとしての brand などです。メタデータにしか存在しないフィールドもあります(例:sku、gtin、@type)。
両方のソースを調べ、意味のあるデータフィールドをすべて抽出してください。「意味のある」とは、ページ自体の主題を説明する情報を指します。ナビゲーション、広告、関連・おすすめ・最近閲覧した項目など、周辺のサイト情報は除外してください。フィールドごとに、次の項目を決めてください。
- name:内容が分かる snake_case 形式のフィールド名
- type:JSON Schema の型名(string、number、integer、boolean、array、object)
- value:抽出した値
引数に応じた 4 つのモード:
- スキーマなし(ステージ 1 — 検出):ページから意味のあるフィールドをすべて抽出します。内容が分かる snake_case 形式の名前を付けてください。
- スキーマあり(ステージ 2 — 既定):スキーマのフィールドを、正確な名前、説明、書式指定のための
examplesに従って抽出します。スキーマにない追加フィールドも抽出してください。ユーザーが把握していないデータが見つかる場合があります。 - スキーマあり+厳密モード(ステージ 2 — 再分析):スキーマのフィールドのみを抽出します。追加フィールドは含めません。
- リストモード(
--list-mode):ページ上の繰り返しコンテナー要素(例:article.product_pod、.search-result)を特定します。スキーマのフィールド名を使用して、すべての項目を抽出してください。追加フィールドは含めず、配列を出力してください。
スキーマモードでは:
- 値があるスキーマプロパティをすべて抽出し、スキーマとまったく同じフィールド名で保存してください。
- スキーマフィールドについては、スキーマの説明と例を優先して従い、出力ファイルには値全体を保持してください。スキーマで型が指定されている場合は、JSON Schema の型ラベル(
string、number、integer、array、object)を使用してください。 - クリーニング済み HTML またはメタデータに値がないスキーマフィールドは、最終回答で欠落に言及せず、省略してください。
- 厳密な抽出が指定されていない限り、メタデータまたはクリーニング済みコンテンツにはっきり存在する意味のある追加フィールドも抽出してください。
- スキーマ型がない追加フィールドには、
string、number、integer、boolean、array、objectを使用してください。 - 商品のメディアフィールドでは、正規 URL、サムネイル、拡大画像、サイズ変更版よりも、スキーマや例の形式に合致する表示 URL を優先してください。
- 意味のある追加フィールドには、商品のパンくずリスト、完全なバリエーション/オファー一覧、抽出した
tools_includedリストから算出するtool_countなど、明らかな件数を含めてください。 - 単独の商品画像と画像一覧の両方がある場合は、該当するなら最適な単独画像フィールドと画像一覧の両方を保存してください。
3. 大きな値の処理
大きな値(長文、HTML コンテンツ、ネストされた構造など)を含むフィールドは、保存する出力には値全体を抽出し、要約には切り詰めたバージョンを用意してください。
値を切り詰める場合は、冒頭部分をそのまま残し、省略した量を明記してください。
- 長文:保存した値の先頭 100 文字をそのまま記載し、合計文字数を示します。
- リストまたは辞書:先頭の項目をそのまま記載し、合計項目数を示します。
4. 出力全体を保存する
output_path が指定されている場合は、抽出結果全体を output_path に保存してください。指定されていない場合は、この手順を省略してください。
ユーザーが特定の形式と構造を指定している場合は、それに従ってください。
それ以外の場合は、次の構造の JSON ファイルを書き出してください。
標準形式(詳細ページ、--list-mode なし):
{
"fields": {
"name": {"type": "string", "value": "Widget X"},
"price": {"type": "string", "value": "$29.99"},
"description": {"type": "string", "value": "Full long description..."}
}
}
リストモード形式(--list-mode):
{
"url": "https://...",
"values": [
{"title": "A Light in the Attic", "price": "£51.77"},
{"title": "Tipping the Velvet", "price": "£53.74"}
]
}
5. 要約を返す
保存したファイルを次のコマンドで要約します。
uv run --python 3.14 SKILL_DIR/scripts/summarize.py OUTPUT_PATH
保存した JSON または YAML を読み込み、各フィールドの名前、型、値を出力します。長い値は手順 3 の説明に従って切り詰めます。その出力を、変更せずに最終メッセージとして使用してください。
output_path が指定されていない場合に限り、要約を自分で作成します。抽出したすべてのフィールドについて、フィールド名、型、値を記載してください。フィールドを省略したり、名前を変更したり、値を引用せずに「8 件のオファー」や「24 個の仕様値」のように説明したりしないでください。
例:
These fields were discovered:
name (string): "Widget X"
price (string): "$29.99"
description (string): "Premium widget with advanced..." (2340 chars)
rating (number): 4.5
The full report is saved to $output_path
リストモード:件数とサンプルを報告します。
list-1 (https://...), saved to $output_path:
20 items extracted
sample: title="A Light in the Attic", price="£51.77"
長い値を切り詰めることで要約を簡潔に保ち、ほかのページの要約と一緒にオーケストレーターのメインコンテキストに読み込めるようにします。