BlogFindings

Do AI crawlers read tables? 87 on 1,079 home pages, and 2 carried a caption

Lantad's own component library says a table is the shape an AI crawler extracts most reliably, and a post in August checked that against five stored pages and found three tables. This run checked it against the whole corpus: 1,419 hostnames asked for robots.txt and then the home page as LantadBot on 23 September 2026, 1,079 pages read as raw bytes with no JavaScript, 38 of them carrying a table at all.

15 min read Lantad

In August that claim was checked against the only pages this scanner had stored at the time, and the result was three table elements across five real pages, all three of them navigation boxes. Five pages cannot settle anything, and the post said so. This run asked the same question of the whole corpus: all 1,419 hostnames in the two committed seed files, each asked for robots.txt and then for its home page once, as LantadBot, on 23 September 2026, with no JavaScript executed. 1,079 of them answered HTTP 200 with HTML. The answer at that scale is not the one the question expects, because the interesting number is not what the tables contain. It is how few of them exist.

In short

  • Asking whether AI crawlers read tables assumes there are tables to read: of the 1,079 home pages Lantad read as LantadBot on 23 September 2026, 1,041 carried no table element at all and 38 carried one.
  • Those 38 pages held 87 table elements between them, and the text inside them came to 5,354 words against 1,374,580 words of visible text on the same pages, which is 0.39 percent of everything a text-only client could read.
  • Two of the 87 tables carried a caption element, on dollyglot.com and metlife.com, and the MetLife one sits on a table that contains no cells at all.
  • 41 of the 87 tables carried no th element anywhere, and of the 216 th elements in the corpus 100 carried a scope attribute, so fewer than half of the header cells state which direction they head.
  • The same 1,079 pages carried 109,439 list items across 21,101 unordered lists, which is 1,258 list items for every table element: these sites enumerate constantly and express almost none of it as tabular data.
What was countedFigureAgainst
Home pages read1,079of 1,419 hostnames asked
Pages carrying at least one table383.5 percent of the 1,079
Table elements in total87median of 1 per page that had any
Tables carrying a caption element2dollyglot.com and metlife.com
Tables with no th element at all41of the 87
Words of text inside tables5,354of 1,374,580 visible words, 0.39 percent
List items on the same pages109,4391,258 for every table element
The 1,079 home pages that answered HTTP 200 with HTML, read as raw bytes by Lantad on 23 September 2026. Every figure here is a count of what the delivered markup contained, not a claim about what any crawler does with it.

Do AI crawlers read tables?

The question has two halves and only one of them is answerable from the outside. Whether a given crawler parses a table element into rows and columns, or flattens it into a run of text, is a property of software this scan never touched, and no AI crawler vendor documents it. Nothing in this post claims otherwise. What a scan of the delivered bytes can establish is the other half, which is whether there is anything tabular on the page to parse in the first place, and that half turns out to carry the weight.

1,041 of the 1,079 home pages carried no table element whatsoever. 38 carried at least one, which is 3.5 percent of the corpus. Those 38 pages held 87 tables between them, unevenly: 20 pages had exactly one, 7 had two, and 11 had three or more, with jalan.net carrying 17 and rbi.org.in carrying 7.

The share of readable text involved is the figure that settles the scale of it. Counting visible words over the served HTML with script, style, noscript, template and comment content removed and tags stripped, the 1,079 pages held 1,374,580 words. 5,354 of those words sat inside a table element. That is 0.39 percent, roughly one word in every 257. Whatever an answer engine does with table markup, on these pages it is doing it to a rounding error.

This is a different failure from the ones this blog usually counts, and worth separating from them. When 141 of 382 home pages carried no structured data in the raw HTML, the finding was that a described mechanism was going unused. When 17 of 380 home pages sent a crawler zero words, the finding was that the prose never arrived. Here the prose arrives in quantity, 1.37 million words of it, and the sites simply do not use the tabular shape to express any of it. Nothing is broken. A choice was made, at scale, by almost everybody, and the effect on prose parity is nil because the words are present either way. The effect is on structure, which is the part an extractor has to reconstruct rather than read.

  • At least one list (ul, ol or dl) 887 pages 109,439 list items in total
  • At least one JSON-LD block 628 pages 1,181 blocks, the documented structured data route
  • At least one table element 38 pages 87 tables, 0.39 percent of visible words
How the 1,079 home pages express content a machine might want to read as a grid. Each bar is the number of pages carrying at least one of that element in the raw bytes. Measured by Lantad on 23 September 2026.

What 1,079 home pages served a crawler

The denominator matters more than usual here, because a rate of 3.5 percent invites the objection that the missing pages were the ones with the tables. The funnel is therefore stated in full, and the pattern in the refusals is stated too.

1,419 hostnames were asked. Each was asked for https://host/robots.txt first, and the reply was evaluated with the scanner's own parser in core/src/robots.ts rather than a purpose-built one, so the crawl obeys the same rules the product ships. 11 hostnames carry an explicit Disallow covering the site root for LantadBot and were left alone: coralvilleanimalhospital.com, botcity.dev, amsterdam.nl, wa.gov, helsinki.fi, sciencedirect.com, scielo.org, theregister.com, sap.com, gmarket.co.kr and instacart.com. A further 36 answered robots.txt with HTTP 503, and the scanner's robotsPolicyFromStatus treats a failing robots.txt as disallow-all until it recovers, so those 36 were not fetched either. That is a decision recorded in the code and not a finding about those sites, and it is the conservative direction: it costs this run 36 pages rather than risking a fetch a crawler should not make. The terms are set out on the scanner's bot page.

Of the 1,372 hostnames that remained, 33 returned no status at all, and 260 answered with something other than HTTP 200 and an HTML content type. 215 of those 260 answered 403, 16 answered 503, 10 answered 202, 6 answered 429 and 4 answered 404, with the remainder split across 401, 405, 406, 451, 498, 500, 508 and one host that answered 200 with a content type that was not HTML. The 403s are the familiar shape: a site refusing an unrecognised user agent on sight, which this blog has measured directly when 92 of 1,056 sites refused GPTBot their robots.txt. Those 293 absent hostnames are not missing at random, because a site that refuses an unknown crawler is likelier to refuse other automation, so every rate below is a statement about the 1,079 that answered.

1,079 pages is the denominator for everything else in this post. The same seed files, the same user agent and the same refusal pattern produced the denominators in the recent runs on images and iframes, which is deliberate: a corpus that moves between posts cannot be compared across them. The full method for a single scan is on the methodology page, and you can watch the same request run against one host with what GPTBot sees.

The request funnel for this run, from 1,419 hostnames to the 1,079 home pages that answered HTTP 200 with HTML. Robots evaluation uses the scanner's own parser in core/src/robots.ts. Measured on 23 September 2026.

Eighty-seven tables, and two of them carried a caption

The 87 tables that do exist were counted for the parts of table markup that make a grid machine-readable rather than merely rectangular, and the parts are not a matter of taste. The WHATWG HTML Living Standard, at html.spec.whatwg.org/multipage/tables.html, carries them in section 4.9 on tabular data, last updated 22 September 2026. It states plainly that "Tables must not be used as layout aids", defines the caption element as representing "the title of the table that is its parent", and makes scope an enumerated attribute that declares whether a header cell governs its row or its column.

46 of the 87 tables carried at least one th element and 41 carried none at all. On 10 of the 38 pages, not one table on the page had a header cell anywhere. That is the shape the W3C's own tables tutorial addresses first, since it states that header cells must be marked up with th and data cells with td, and that the point of doing so is that "headers and data cells can be programmatically determined by software". A grid of td elements renders identically and declares nothing about which values are labels.

Of the 216 th elements in the whole corpus, 100 carried a scope attribute, so 116 did not. MDN's table reference, last modified 24 April 2026, is careful about what that costs: scope "is redundant in simple contexts, because scope is inferred", and the reason to write it is that "some assistive technologies may fail to draw correct inferences". So 116 bare th elements is not 116 defects, and this post will not call them that. It is 116 places where a consumer has to infer rather than read, on a shape that is already rare.

The caption count is the one that does not admit a defence. Two of the 87 tables carry a caption element. One is on dollyglot.com, whose single table carries 7 th elements, all 7 with a scope attribute, and a caption: the best-formed table found in the corpus. The other is on metlife.com, and that table contains no cells at all, so the corpus holds one captioned table with data in it. Both pages were re-requested by hand the same day and both confirmed. 33 of the 87 tables carried a thead, 49 were grids of at least two rows with at least two cells in a row, and 34 were a single row, which is a shape that is usually layout rather than data even when nothing declares it so. Only 3 tables in the entire corpus said as much, carrying role="presentation" or role="none".

Feature of the markupTablesShare of the 87
At least two rows and two cells in a row4956.3 percent
At least one th element4652.9 percent
No th element anywhere4147.1 percent
A thead element3337.9 percent
A single row only3439.1 percent
Declared presentational (role none)33.4 percent
A caption element22.3 percent
The 87 table elements found on 38 of the 1,079 home pages, counted by the markup features that make a grid machine-readable. Element definitions are from the WHATWG HTML Living Standard section 4.9, last updated 22 September 2026. Measured by Lantad on 23 September 2026.

The web enumerates in lists, not in tables

The August post on five pages noted that those pages held 1,127 list items and three tables, and suggested the sites were not short of enumerated content but expressed none of it as a grid. At 1,079 pages that reading holds, and the ratio is starker than the small sample implied. The corpus carries 109,439 list items across 21,101 unordered lists, 303 ordered lists and 216 definition lists, and 887 of the 1,079 pages carry at least one. That is 1,258 list items for every table element in the corpus, and 887 pages using one shape against 38 using the other.

A second comparison makes the point about effort rather than habit. 628 of the 1,079 pages carry at least one JSON-LD block, 1,181 blocks in total. Publishing structured data is the more demanding thing to do: it means choosing a vocabulary, writing markup nobody sees, and keeping it true as the page changes, which is why 298 of 1,277 FAQ answers turned out not to be on the page when this blog counted them. Adding a th element to a grid already on the page is close to free. Sixteen times as many pages do the expensive thing.

Where the tables are is a platform story rather than a sector one, which is the same pattern the image run found. The categories with any meaningful table presence are single page app startups at 7 of 44 pages, SaaS marketing at 3 of 37 and ecommerce at 5 of 66. Five whole strata carried no table at all across 203 pages between them: Webflow with 42 pages, Wix and Squarespace with 54, Bubble and no-code with 42, WordPress small business with 36 and local media with 29. A visual site builder has no table primitive a marketing user will reach for, and the output shows it. Teams that hand-write their markup, or use a component library that ships one, are the only ones producing grids, which argues for reading a stack guide rather than a generic checklist.

One site cuts the other way hard enough to name. trustmrr.com served 3 tables holding 510 cells, and 2,516 of its 3,546 visible words sat inside them, which is 71 percent of the readable page. It is the only page in the corpus where tables carry the substance, and it carries no caption on any of the three. At the other end, 3 pages carried tables holding no text whatsoever: nfz.gov.pl, cnbc.com and amazon.com. A table with no words in it is markup a crawler must walk through to find nothing, which is the same cost pattern as the iframes that held 50 words between 17 of them.

  • Single page app startups 15.9 percent 7 of 44 pages, 11 tables
  • SaaS marketing 8.1 percent 3 of 37 pages
  • Ecommerce 7.6 percent 5 of 66 pages, 10 tables
  • Shopify direct to consumer 5.9 percent 2 of 34 pages
  • Healthcare 5.2 percent 5 of 96 pages
  • Travel 5.1 percent 4 of 79 pages, 24 tables
  • Finance 4.3 percent 4 of 94 pages
  • News 3.4 percent 2 of 59 pages
  • Education 2 percent 2 of 102 pages
  • Government 1.2 percent 1 of 86 pages
  • SaaS 0.9 percent 1 of 117 pages
  • Webflow, Wix, Squarespace, Bubble, WordPress SMB, local media 0 0 of 203 pages across five strata
Share of home pages carrying at least one table element, by the corpus category the hostname is filed under in worker/seeds/corpus-seeds-industry.json and worker/seeds/corpus-seeds-platform.json. Categories with fewer than 28 sites read are omitted. Measured by Lantad on 23 September 2026.

What to check on your own page, and what this run did not measure

The practical reading is narrow, because the honest conclusion of a supply-side count is a supply-side instruction. If your page presents values against criteria, pricing tiers, specifications, opening hours, fare classes, then a grid with th elements and a caption costs one afternoon and makes the relationship between label and value explicit in the bytes rather than implicit in the layout. If it does not, this post is not an argument for inventing tables, and a list is a perfectly good shape for a list. The failure mode worth avoiding is the one the spec names directly: a table used as a layout aid adds structure that means nothing and has to be walked anyway.

Lantad's own extractor makes a decision here that is worth knowing before you act on any of this, and it is a decision rather than a finding. In core/src/extract.ts, MAIN_BLOCK_TAGS holds h1 through h6, p and li, and it does not hold td or th. Table cells appear in BLOCK_BOUNDARY_TAGS, so they end a block without starting one that counts as main content. The consequence was measured in August and published: a two column table outside main or article yielded a word count of zero while the same facts as list items yielded five. That is this scanner's rule, not the web's, and a site whose data lives in tables outside its main element is scored accordingly. Anyone reading an AI visibility number from any vendor is reading that vendor's extraction decisions as much as their own page.

Four things this run did not measure, stated because the title asks a question the method cannot fully answer. No AI crawler fetched anything here: every request came from LantadBot, so nothing is claimed about what GPTBot, ClaudeBot or PerplexityBot do with a table element, and no vendor documents it. No JavaScript was executed, so a table injected after load was not seen and all 87 counts are floors, the same limit that applied when JavaScript supplied 7.6 percent of the prose on 271 pages. Only the home page was read on each host, and a home page is the least likely page on a site to carry a specification grid, so the 3.5 percent is a statement about home pages and not about whole sites: a pricing or docs page would very likely score higher, as the run on pricing pages suggests. And the corpus is an editorial sampling frame rather than a random draw, so every rate here supports a statement about these 1,419 hostnames and nothing wider, which is the standing caveat on the crawlability study.

What the run does establish is that the premise under the original code comment is thinner than it reads. A table may well be the shape an answer engine extracts most reliably. On the home pages of 1,079 real sites it is also the shape almost nobody sends, which means the reliability is mostly theoretical, and the answer engine is reconstructing relationships from lists and layout instead. If you want to see what your own file says before you change anything, the robots.txt tester and the guidance on getting cited by ChatGPT are the places this site sends people next.

  • Header cells are th, not styled td 41 of the 87 tables in this corpus carried no th anywhere, which leaves nothing declaring which values are labels.
  • A caption element names the table 2 of 87 carried one. The spec defines caption as the title of the table, and it is the cheapest context a grid can carry.
  • scope says row or column 100 of 216 th elements carried it. MDN calls it redundant in simple tables and useful where inference fails.
  • No table used for layout The standard states that tables must not be used as layout aids. 3 tables in the corpus declared themselves presentational.
  • The grid is in the HTML, not built by script This run executed no JavaScript, so a table assembled client side is invisible to the same extent it is invisible to a crawler that does not render.
What to look for in your own markup if a page presents values against criteria. Derived from the WHATWG HTML Living Standard section 4.9 and the W3C WAI tables tutorial, not from a Lantad measurement.

Written by

Lantad

Published .

Every comparison published on this site arrives as a grid because a code comment says it should. The file that defines the figures, site/src/lib/visual.ts, renders a table as semantic table markup rather than as an image "because a table is the shape an AI crawler extracts most reliably". That is a design decision rather than a measurement, and read the other way it is a claim about everybody else's pages. If the table is the most reliably extracted shape, the pages an answer engine reads should contain some.

Common questions

Do AI crawlers read HTML tables?

No vendor documents it, so this post makes no claim either way. What Lantad measured on 23 September 2026 is the supply side: of 1,079 home pages read as LantadBot, 38 carried a table element and the text inside all 87 of them came to 0.39 percent of the visible words on those pages. Whatever a crawler does with table markup, on these pages there is very little of it to do.

Should I convert my lists into tables so AI can read them better?

Only where the content is genuinely tabular, meaning values set against criteria. A list is the correct shape for a list, and the HTML standard's rule that tables must not be used as layout aids applies just as much to a table built to impress an extractor. The corpus carried 109,439 list items and 87 tables, and most of those list items are in the right shape already.

What makes a table machine-readable rather than just rectangular?

Three things the specification names: th elements marking header cells so software can tell labels from values, a scope attribute where the direction of a header is not obvious, and a caption element naming what the table is. In this corpus 46 of 87 tables had a th, 100 of 216 th elements had a scope, and 2 tables had a caption.

Why did only 1,079 of 1,419 sites count toward these figures?

11 hostnames disallow LantadBot at the site root and 36 answered robots.txt with HTTP 503, which the scanner treats as disallow-all, so 47 were never fetched. Of the rest, 33 returned no status and 260 answered with something other than HTTP 200 and HTML, 215 of those being a 403. Sites that refuse an unknown crawler are not missing at random, so every rate here describes the 1,079 that answered.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.