extracting-tables
SkillDocs & knowledgeUse when extracting tabular data from HTML. Covers GFM Markdown tables, the structured tables array (grid cells plus pre-rendered markdown), and HTML line breaks in table cells.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the extracting-tables skill
What this skill tells your AI
The instructions your AI receives, as published by xberg-io/html-to-markdown in plugin/skills/extracting-tables/SKILL.md and read by ahel’s review.
Extracting tables
Use this when the user wants tabular data out of HTML — pricing tables, data
grids, spec sheets. html-to-markdown parses <table> elements into two
surfaces at once: inline GFM Markdown tables in the content stream, and a
structured tables array in the JSON output.
Two surfaces
# Inline GFM tables appear in the Markdown body
html-to-markdown input.html
# Structured table data appears under result.tables (JSON)
html-to-markdown --json input.html | jq '.tables'
- Markdown tables in
content—| col | col |blocks, good for LLM ingestion and human reading. - Structured
tablesarray — each entry has amarkdownfield (pre-rendered) and agridof structured cells (rows × cols). Use this when downstream code needs exact cell access.
Both are populated from the same parse; you do not need a flag to enable table parsing.
Extraction-only
When you only care about tables (not the Markdown body):
html-to-markdown --json --no-content input.html | jq '.tables'
Inspecting tables
# How many tables, and the row count of each
html-to-markdown --json input.html \
| jq '.tables | to_entries | map({index: .key, rows: .value.grid.rows, cols: .value.grid.cols})'
# Just the rendered markdown of the first table
html-to-markdown --json input.html | jq -r '.tables[0].markdown'
Line breaks in cells
By default <br> inside a cell is converted to a space. Keep hard breaks:
html-to-markdown input.html --br-in-tables
Programmatic access
from html_to_markdown import convert, ConversionOptions
html = "<table><tr><th>A</th><th>B</th></tr><tr><td>1</td><td>2</td></tr></table>"
# result.tables is only populated when include_document_structure=True
result = convert(html, ConversionOptions(include_document_structure=True))
for table in result.tables:
print(table.markdown) # rendered GFM markdown
print(table.grid.cells[0].content) # first cell (grid is a TableGrid)
import { convert } from "@xberg-io/html-to-markdown";
// Node's convert() returns a ConversionResult object directly.
const result = convert(html);
for (const table of result.tables ?? []) {
console.log(table.markdown); // rendered table
// table.grid is a TableGrid: { rows, cols, cells: GridCell[] }
}
Notes and limits
- Nested tables are flattened — the inner table is rendered inline within the parent cell.
- Merged / spanning cells are reconstructed positionally; the span itself is not preserved as separate metadata.
- Malformed tables still parse on a best-effort basis; check
result.warnings(or--show-warnings) for non-fatal issues.
See ../html-to-markdown/references/cli-reference.md (Tables section) for the
full flag set.
Signals
- GitHub stars
- 869
- Forks
- 70
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
extracting-tables- Source
- github.com/xberg-io/html-to-markdown