FileGizmo Data tools
Convert an HTML table to CSV
Paste a table copied from a web page and get a CSV back, with merged cells expanded across the rows and columns they actually cover.
Complete
Your result is ready
Simple by design
HTML table to CSV in three steps
Copying a table out of a web page and into a spreadsheet works about half the time. The other half you get one long column, or the cells arrive merged in ways nobody asked for, or the whole thing lands in a single row.
Pasting the markup instead is more reliable, and it makes the awkward parts explicit rather than leaving them to a paste handler.
Merged cells are the part that goes wrong
A table cell can declare that it spans several columns or several rows. Visually this is a merged cell and it is extremely common in tables written for people to read, where a heading covers three columns beneath it or a category label covers four rows.
CSV has no concept of a merged cell. Every row has the same number of fields, and a value sits in exactly one of them. So a converter has to decide what to do, and the usual decision is to ignore the span and emit one cell.
That is the wrong answer, and it is wrong in a way the output does not show. Every cell after a span is now one column to the left of where it belongs, so the values no longer line up with their headers. The file looks fine, opens fine, and is misaligned from the first merged cell onwards.
This expands spans instead. A cell covering three columns produces the same value in three fields; a cell covering two rows produces that value in the same column of the next row. The result says when it has done this, so you know your table had merged cells and can decide whether repeating the value was what you wanted.
What it will and will not read
It needs a real table. That means table, tr and td or th tags, which is what you get from copying a page’s source or from a browser’s developer tools.
It will not read a layout built from divs. Plenty of modern pages present something that looks like a table and is a grid of styled containers with no table structure at all, and recovering rows and columns from that would mean guessing from visual position, which markup alone cannot support.
Script and style contents are removed with their elements before anything is parsed, so a page saved with its JavaScript intact does not leak code into your data. Entities are decoded, so an ampersand written as & arrives as an ampersand. A line break inside a cell becomes a space rather than a newline, because a newline inside a CSV field is legal, surprising, and usually not what was meant.
Nothing is fetched
Paste the markup rather than a URL. This page cannot make a request, which is enforced by the policy it is served with rather than promised, so there is no version of this tool that goes and gets the page for you. That is a real limitation and the reason the privacy claim is checkable.
Rows are padded to a consistent width, and any cell beginning with a character a spreadsheet would read as a formula is escaped before it is written.
- 1
Copy the table or its HTML and paste it in
- 2
Choose which table if the markup holds more than one
- 3
Press Read the table and download the CSV
Good to know
Frequently asked questions
What happens to merged cells?
They are expanded across every row and column they cover, so the value appears in each cell of the span. Ignoring spans is the usual shortcut and it shifts every following row sideways, which silently breaks the alignment with the headers.
Can it read a table made of divs?
No. A layout built from divs and CSS has no table structure to recover, and guessing one from visual position is not something that can be done from markup alone. This needs real table, tr and td tags.
Does it fetch the page for me?
No. Nothing is fetched, and this page cannot make a request. Copy the table or view the source and paste the markup in.
What if the markup contains several tables?
The result says how many were found and a control chooses which one, counting from the top of the markup.