The table is in the iframe and your scanner never saw it
How nested HTML tables hide inside frames, why a top-page copy misses them, and how to capture that inner grid locally in Chrome.
The table is in the iframe and your scanner never saw it
I have had this conversation more than once. Someone says the page has no table. I look at the page. There is a table. We open the inspector. The table is in a child document. The parent is a shell: nav, filters, a comment widget. The grid arrived from another origin or another app and was framed in.
A top-page copy selects the shell. A top-page scraper reports zero tables or reports the footer link farm. The useful rows never enter the clipboard.
If you work with embedded dashboards, older admin tools, or “we wrapped the legacy app” intranet pages, this is the default architecture. It is not a trick. It is how teams ship without rewriting the grid.
How to confirm you are in a frame
Right-click a cell. If the browser offers “View frame source” or the inspector shows a #document under an iframe, you are done guessing.
The frame may be same-origin, which is easier, or cross-origin, which can block scripts. An extension running with page access still has a better chance than your mouse.
Nested frames exist. A tabset inside a frame inside a layout is not rare in products that grew for ten years.
Why selection stops at the border
Browsers isolate framed documents. Your highlight does not travel through the border as a single HTML table. You get the parent, or you get nothing useful.
Print view sometimes flattens frames. I have used that as a desperate move. It also brings every header and footer in the shell. I prefer a capture that names the inner table.
Capture the inner grid on purpose
I want a tool that lists tables from frames as first-class sources. I pick the inner one. I ignore the outer one.
Table Capture Chrome is written for nested HTML tables that top-page scanners miss. Once the inner grid is in Table Studio, it is an ordinary repair job: headers, types, junk columns, then Excel or CSV. The bytes stay in the browser.
If several frames each have a table, I capture them as separate files. Merging in the editor is how you invent columns that never existed.
Filters live in the parent, data lives in the child
This split causes a second class of error. You set a date range in the parent. The frame refreshes slowly. You capture too soon and get last week’s rows with this week’s filter label in the filename.
I wait until the inner grid stops showing a spinner. I check a date inside the table, not the filter text in the parent.
If the frame does not refresh after a filter change, I reload the whole page. Framed apps are allowed to be rude.
Cross-origin frames and the wall
If the framed app is on another host and the owner set a strict policy, you may not be able to read the cells. That is the site working as designed. Use the inner app’s own export, or open the frame URL directly if you have access.
Opening the frame URL in its own tab is a legitimate move. Then it is no longer an iframe problem. It is a normal page.
I do not fight a cross-origin wall with screenshots and OCR unless the table is tiny and the deadline is stupid.
PDFs framed as viewers
Some “iframe tables” are PDF.js or a similar viewer. You are not looking at HTML rows. You are looking at a file. Switch to PDF capture, or download the PDF and open it as a local file.
I have wasted time trying to treat a PDF viewer as a DIV grid. The cells are glyphs.
After the inner table is out
I name the file after the inner source, not the shell. legacy-orders-2026-08-30.xlsx beats intranet-portal.xlsx.
I delete columns that belong to the embedded app’s UI: row selectors, overflow menus, a trailing empty column used for a scrollbar.
I check types the same way I would on a top-level table. Frames do not make dates cleaner.
If I need a range, I drag inside the inner grid. Dragging from the parent will not enter the frame.
A short field note
The day I stopped arguing with people who said “there is no table” was the day I started asking them to right-click a number. The frame source option ends the argument. Then we capture the child document and go home.
Iframes are not exotic. They are a packaging choice. Your extractor has to know that, or you will keep exporting the navigation.
Login shells and double sessions
Framed apps often have their own login. The parent says you are authenticated. The child shows a login table that looks, for a moment, like a data grid (username, password, submit). I have seen that captured. The filename was users.xlsx. It was not users.
If the inner grid is a form, I stop. If the inner grid is data and a session expired, I refresh the frame, not only the parent.
Session cookies can be parent-only. Opening the frame URL in a new tab then asks you to log in again. That is annoying and still better than capturing an empty state.
Print CSS that hides the frame
Some shells hide iframes in print media. If you try “Print to PDF” as a workaround, the grid vanishes and you get a handsome cover page. That workaround is a trap. Capture the child or open the child URL.
Sandbox attributes
An iframe can be sandboxed so scripts inside it are limited. The table may still be static HTML you can read. It may also be a blank box waiting for JavaScript that never ran. If the frame looks empty in a normal window but full after you click around, wait for the script, then capture.
I do not disable security settings to “make the table appear”. I use the access I already have.
A two-frame page I still remember
A logistics portal put bookings in the left frame and cargo details in the right. Selecting in the parent copied neither. Capturing without looking at the list produced the left table only, because it loaded first.
The note in our folder now says: left frame is bookings, right frame is cargo, capture twice, join on booking id in Excel. The join is a VLOOKUP or an index-match on booking_id. We do not invent a mega-table in the editor.
That is the mature version of iframe work. You accept two files. You keep a key column. You stop asking the shell to be a database.
What I tell new people on the rota
Right-click a number. If you see anything about a frame, you are not on the table’s page. Capture the inner document. Name the file after that document. Do not export the menu.
If they remember only that, the rest of the week gets quieter.