Semantic list usage
What it checks
One audit over every list-shaped block of content: is it marked up as a list, or is it a div stack, a broken <dl>, or a run of paragraphs that start with “1.”, “2.”, “3.”?
| State | Result |
|---|---|
| no list-shaped content anywhere (and no pages scanned counts as this) | na |
every content list uses <ul>/<ol>/<dl> markup |
pass |
| at least half of the content lists are semantic | warn, priority medium |
| most content lists are div stacks or numbered prose | fail, priority medium |
Navigation, breadcrumb, pagination, tab, carousel and table-of-contents lists are excluded from both sides of the ratio — by region (nav/header/footer/aside, the matching ARIA roles), by class name, and by BreadcrumbList/SiteNavigationElement microdata. <dl> counts as a semantic list only with a paired <dt>/<dd>; <ol> with ≥3 items is additionally reported as a step list; <dfn> is reported as a definition element.
Why it matters
Content marked with ul/ol/li and table/tr/th/td survives HTML-to-markdown conversion and accessibility-tree serialization as discrete list items, rows and columns, with item and cell boundaries preserved. The same content built from nested divs collapses into undelimited running prose. An LLM must then re-infer where one item or row ends and the next begins, and cell-to-header association is lost entirely.
Evidence
Semantic lists and tables versus div soup
HTML-AAM makes lists and tables first-class in the tree that agents read: table→table, th→columnheader/rowheader, with list/listitem roles for ul/ol/li [w3c-html-aam]; Playwright’s snapshot contents explicitly enumerate ‘lists’ and table structures [playwright-mcp-snapshots]. browser-use treats role='row'/‘cell’/‘gridcell’ as interactive targets [browser-use-clickable-elements]. On the extraction side, trafilatura ships include_tables enabled by default, and include_formatting renders structure ‘as markdown for text formats’ [trafilatura-corefunctions]. Readability applies a dedicated list-aware threshold: a node survives when more than 90% of its text sits inside list items. Genuinely list-shaped ul and ol therefore survive its cleanup pass while div stacks of links do not [mozilla-readability-source]. Cloudflare’s markdown pipeline is the mass-market version of the same conversion, delivering an 80% token reduction while keeping headings, lists and tables [cloudflare-markdown-for-agents].
Limits
No vendor doc and no study isolates the effect of list/table markup on LLM answer accuracy — the mechanism is well documented, but the magnitude is not measured in any source located for this dossier. ARIA is an accepted substitute. A div grid carrying role='table', role='row' and role='cell' maps to the same accessibility tree nodes. ‘div soup’ with correct roles is therefore not penalised by a11y-tree consumers, and an audit that only looks for literal <table> and <ul> tags will produce false positives. Conversely raw-HTML consumers (which the observation-reduction study shows strong models sometimes prefer [observation-reduction-paper]) see the div tags either way. Definition lists (dl/dt/dd) in particular have no documented agent consumer beyond generic role mapping.
How it scores
The mechanism is documented at the standard level. HTML-AAM maps table to table, and th to columnheader or rowheader. Lists carry list and listitem roles. Playwright’s snapshot contents enumerate lists and table structures, and browser-use treats role='row', 'cell' and 'gridcell' as interactive. What is missing for an A is magnitude: no vendor document and no study isolates the effect of list and table markup on answer accuracy. ARIA is also an accepted substitute — a div grid carrying the right roles reaches the same accessibility tree — so “div soup” is not automatically a defect.
Sources
- HTML Accessibility API Mappings 1.0 — W3C, draft-spec (verified 2026-08-21)
- Snapshots — Playwright MCP — Microsoft, vendor-doc (verified 2026-10-20)
- browser-use ClickableElementDetector source — browser-use, vendor-doc (verified 2026-08-20)
- trafilatura core functions documentation — Adrien Barbaresi / trafilatura, vendor-doc (verified 2026-08-21)
- Readability.js source — _isProbablyVisible — Mozilla, repo (verified 2026-08-20)
- Introducing Markdown for Agents — Cloudflare, vendor-doc (verified 2026-08-20)
- Read More, Think More: Revisiting Observation Reduction for Web Agents — arXiv (Enomoto, Obara, Zhang, Oyamada, 2026), study (verified 2026-08-20)
- mozilla/readability Readability.js source — Mozilla, vendor-doc (verified 2026-08-20)
Browser view
Playwright MCP “uses accessibility snapshots instead of screenshots”, and its snapshot examples list list and listitem nodes (verified 2026-10-20). List markup is what turns a run of items into that structure; div soup reads as loose text.
The snapshot path reuses this audit on each complete, unredacted, non-loading DOM capture that carries readable text. It reports the original static verdict as an unscored browser finding. It does not prove HTTP delivery, computed appearance, a complete accessibility tree, live form state, or action success. The source and page URL accompany every finding. Existing implementation limits still apply.
The individual evidence review and limits appear in Browser-rendered snapshot assessment. The explicit eligibility record lives in packages/core/src/snapshot-eligibility.ts. Original crawler grades, tiers, and weights stay unchanged.