Skip to main content
AIDiveForge AIDiveForge
🧬

HTML-to-Dataset Extractor

Data Extraction & Parsing · by AIDiveForge · Apr 20, 2026 · Intermediate

Extract a repeated HTML structure into rows with traceable missing values.

Get a CSV or JSON table, extraction rules and validation results.

Free · 2 KB · SKILL.md, instructions and example files. Provide the HTML or an accessible page and the fields you need.

A worked example

A small example to try before using your own data.

Input

<ul><li class="item"><b>Alpha</b><span>$5</span></li><li class="item"><b>Beta</b></li></ul>

Expected result

name,price
Alpha,$5
Beta,

Rule: one row per li.item; name from b; price from span or empty. Source rows: 2. Output rows: 2.

What to check: Produce two rows and keep Beta’s missing price empty. Do not reuse Alpha’s price or drop the second row.

Limits: Selectors are site-specific and may change. This workflow does not bypass access restrictions or guarantee extraction from every site.

Worked example included. Model-specific performance and vendor compatibility have not been benchmarked.

Installation options and other formats

Install this skill

An agent skill starts with SKILL.md. The ZIP also includes its examples and any helper scripts. Drop the file into your tool of choice — or pick a different format if you use Cursor, Windsurf, Copilot, or something else.

Download SKILL.md
python3 - <<'ADF_SKILL_INSTALL'
import hashlib, io, os, stat, tempfile, urllib.request, zipfile
from pathlib import Path, PurePosixPath
folder = "html-to-dataset-extractor"
root = Path(os.environ.get('ADF_SKILL_ROOT', str(Path.home() / '.claude' / 'skills'))).expanduser()
destination = root / folder
if destination.exists() or destination.is_symlink():
    raise SystemExit('An installation already exists. Back it up and merge the ZIP deliberately.')
root.mkdir(parents=True, exist_ok=True)
request = urllib.request.Request("https://aidiveforge.com/skill/html-to-dataset-extractor.zip", headers={'User-Agent': 'AIDiveForge-Resource-Installer/1.0 (+https://aidiveforge.com/skills/)'})
with urllib.request.urlopen(request, timeout=30) as response:
    data = response.read(8 * 1024 * 1024 + 1)
if len(data) > 8 * 1024 * 1024 or hashlib.sha256(data).hexdigest() != "038e466cd342834be44e4ae94f25e1fe47aa9f116d9b9a665449ef54bcb79703":
    raise SystemExit('The download did not match this reviewed bundle. No files were installed.')
with zipfile.ZipFile(io.BytesIO(data)) as archive, tempfile.TemporaryDirectory(prefix='.adf-skill-', dir=root) as temporary:
    members = archive.infolist()
    if len(members) > 100 or sum(m.file_size for m in members) > 16 * 1024 * 1024:
        raise SystemExit('Unexpected archive size')
    for member in members:
        name = PurePosixPath(member.filename)
        if name.is_absolute() or '..' in name.parts or not name.parts or name.parts[0] != folder or '\\' in member.filename or stat.S_ISLNK(member.external_attr >> 16):
            raise SystemExit('Unsafe archive entry; nothing was installed')
        target = Path(temporary).joinpath(*name.parts)
        if member.is_dir():
            target.mkdir(parents=True, exist_ok=True)
        else:
            target.parent.mkdir(parents=True, exist_ok=True)
            with target.open('xb') as stream:
                stream.write(archive.read(member))
    staged = Path(temporary) / folder
    if not (staged / 'SKILL.md').is_file() or destination.exists() or destination.is_symlink():
        raise SystemExit('The skill could not be installed without replacing existing data')
    os.rename(staged, destination)
print('Installed the complete skill folder:', destination)
ADF_SKILL_INSTALL

Claude Code: ~/.claude/skills/html-to-dataset-extractor/SKILL.md. Codex: ~/.codex/skills/html-to-dataset-extractor/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

Produce two rows and keep Beta’s missing price empty. Do not reuse Alpha’s price or drop the second row.

⚙️ How it works

  1. Inspect the rendered or supplied structure and identify one repeated record boundary.
  1. Map fields to selectors or explicit text rules; keep the source URL or row locator.
  1. Handle absent fields as null/empty according to the output contract, and normalize whitespace without altering meaning.
  1. Deduplicate only with an explicit key and verify source record count against output row count.
  1. Validate required fields and sample rows against the source. Report pagination or dynamic-content limits.

Description

Get a CSV or JSON table, extraction rules and validation results.

Provide the HTML or an accessible page and the fields you need.

Limits: Selectors are site-specific and may change. This workflow does not bypass access restrictions or guarantee extraction from every site.

Recommended Use

Tools and workflow packs this skill pairs well with. Forge picks are auto-generated from category + capability signals; Community picks are added by people who've used the pairing.

No matches yet. Be the first to suggest a pairing, or the Forge will populate suggestions as signals align.