Data tables have header associations
What it checks
Agents extracting tabular data rely on header↔cell associations (th scope / headers attr) to know what each value means. Missing associations make tables ambiguous.
Why it matters
The presence of <th>/<thead> is what causes an extractor to classify a table as a DATA table rather than a layout table, and data-table classification is what exempts it from boilerplate deletion. In Mozilla Readability, a table carrying none of col, colgroup, tfoot, thead or th, and no caption or summary, is treated as layout. Its cleanup pass then becomes free to remove it, so a th-less pricing or spec table can be deleted outright before the content reaches the model. In the accessibility tree, th additionally resolves to columnheader/rowheader so header-to-cell association survives.
Evidence
Data tables with th
Readability classifies a table as a data table when it carries col, colgroup, tfoot, thead or th, or a caption or summary. Its _cleanConditionally pass then skips it, and a table with none of those is treated as layout and deleted [mozilla-readability-source]. HTML-AAM maps th to the columnheader or rowheader roles [w3c-html-aam], over the WAI-ARIA 1.2 role set [w3c-wai-aria-1-2]. trafilatura keeps tables by default via include_tables, and renders them as markdown under include_formatting [trafilatura-corefunctions]. Markdown table syntax itself requires a header row, so a th-less table converts to a header-less or arbitrarily-headed markdown table. browser-use exposes the row, cell and gridcell roles as addressable [browser-use-clickable-elements].
Limits
Two real caveats. First, th is sufficient but not necessary in Readability. The same function also classifies by size: roughly 10 or more cells, or 10 or more rows and 4 or more columns. So a large th-less table survives anyway — the deletion risk is concentrated in small tables. Second, the scope attribute is a weaker signal than th, and should be graded C on its own. None of the extractors examined — Readability, trafilatura, htmldate — reads @scope, and no agent harness doc mentions it. scope matters for the HTML header-association algorithm, and for screen readers.
It reaches agents only indirectly, through the a11y tree on complex multi-level tables. Caption adoption is tiny (1.6% of desktop sites [web-almanac-2025-accessibility]) so caption should be advisory, not required. Recommend scoring th/thead presence, and treating scope and caption as informative sub-checks.
How it scores
Specific, and readable in Mozilla Readability’s own source. A table counts as a data table when it carries col, colgroup, tfoot, thead or th. Its _cleanConditionally pass then skips that table. So th is literally what saves a table from boilerplate deletion. HTML-AAM then maps it to columnheader or rowheader in the tree agents read. Two caveats keep it at B. th is sufficient but not necessary: the same function also classifies by size, roughly ten or more cells, so the deletion risk is concentrated in small tables. And scope specifically is a weaker signal than th, which is why the audit does not weight the two alike.
Sources
- Readability.js source — _isProbablyVisible — Mozilla, repo (verified 2026-08-20)
- HTML Accessibility API Mappings 1.0 — W3C, draft-spec (verified 2026-08-21)
- Accessible Rich Internet Applications (WAI-ARIA) 1.2 — W3C, spec (verified 2026-08-20)
- trafilatura core functions documentation — Adrien Barbaresi / trafilatura, vendor-doc (verified 2026-08-21)
- browser-use ClickableElementDetector source — browser-use, vendor-doc (verified 2026-08-20)
- Web Almanac 2025 — Accessibility chapter — HTTP Archive, dataset (verified 2026-08-20)
- mozilla/readability Readability.js source — Mozilla, vendor-doc (verified 2026-08-20)