Opens in a new tabSkip to content
Agent LighthouseAgent Lighthouse

    Searches the text of every published page. The evidence sources themselves are not in this index — search all of them on the trusted sources page.

    GitHub ↗
    Browse checks and page contents
    operability-safety/table-headers

    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