piapia123
en

HTML Analyzer

Text

Everything runs locally in your browser — nothing is uploaded

Input
Drop a file here to load its contents
Output

⚠️ This tool makes no network requests, so the page is yours to fetch: open it and view source, or `curl -s https://example.com > page.html`. What you get is the raw HTML the server returned rather than the rendered DOM, which is the right thing for analysing scripts, links and meta tags. This answers a few concrete questions: is the heading structure complete? How many images lack alt? How many tags are there, and which dominates? What is the text once tags are stripped? The most useful part is skipped-level detection. You cannot see this by looking at font sizes — the page looks fine, while screen readers and search engines read the outline to understand it. Jumping from `<h1>` straight to `<h3>` puts the content at the wrong depth for them. ⚠️ Two things to be clear about: It does not repair anything. A browser fills in your missing `</div>` and moves misplaced tags out of tables. The parser here does not — what this tool wants is what the original text actually says. An unclosed tag is a fact the author needs to know, and a parser that silently fixes it hides exactly that. The cost is that it is a tolerant tag splitter rather than a complete HTML5 parser; for the questions here that is enough. It is the parser shared by the whole site (HTML to Markdown, UBB conversion and XPath all use it), so a given page reads the same in every tool. It does not judge whether the page is good. A skipped level or a missing alt is a hint, not an error: single-page apps build their DOM in JavaScript, so a static shell legitimately has no `h1`. And `alt=""` versus no alt attribute at all are two different things, counted separately here — the first is an omission, the second is an explicit “this is decorative”. Everything runs in your browser.

Features

  • Heading outline: h1–h6 in order with their text (inline tags are crossed through, so `<h2>Hello <em>world</em></h2>` reads as `Hello world`)
  • ⚠️ Skipped-level detection: `<h1>` to `<h3>` is flagged, with an explanation of why it matters
  • ⚠️ With no h1 it says “normal for an app shell, possibly an omission otherwise” rather than just showing 0
  • Links: every `<a href>` with its anchor text, `rel` and `target` (shown as (none) when absent), with external ones marked
  • ⚠️ Link types: internal, external, anchor, mailto, tel, javascript: (unsafe, flagged in red with an explanation), download and empty, each with a count and share
  • Images: ⚠️ missing alt and `alt=""` counted separately — the first is an omission, the second is a statement
  • Tag frequency, ranked and with each tag’s share, so you can see what the markup is actually built from
  • Plain text: the body with tags stripped (script and style excluded), with line breaks at block elements
  • Document info: title, lang, meta description, meta viewport
  • Counts: bytes, total tags, text characters, comments
  • ⚠️ No tag repair — it reports what the original text says, and an unclosed tag stays unclosed
  • ⚠️ A `>` inside an attribute value and a `<` inside a script do not derail the scan

How to use

  1. Paste the HTML — a whole page or a fragment
  2. Tick “also output the text” if you want the stripped body
  3. Read it group by group: document → headings → skipped levels → links → images → tags

FAQ

Why not use the browser’s HTML parser?
Because a parser corrects what it considers wrong HTML, and an analysis tool needs to see the original text. An unclosed `<div>` or a tag misplaced inside a `<table>` are facts the author needs to know, and a parser quietly fixing them hides exactly those. There is also a structural reason: every conversion tool on this site is a pure function, and touching `document` would make it untestable outside a browser — so the site shares one DOM-free parser (HTML to Markdown, UBB conversion and XPath use it too). It does not implement the full HTML5 parsing algorithm, only tag and text splitting, which the page states.
What is the difference between no alt and alt=""?
A large one. No alt attribute is an omission: a screen reader has nothing to announce and falls back to the filename (“IMG_2043.jpg”). `alt=""` is an explicit statement that the image is decorative and should be skipped. Counting them together makes a page that correctly uses `alt=""` look as bad as one that forgot — when the fixes are opposites: the first needs a description, the second needs to be left alone.
Why is having no h1 sometimes fine?
Because a single-page app’s HTML is often just a shell: the content and headings are built in the browser by JavaScript, so the server-rendered document genuinely has no `<h1>`. Search engines handle that case specifically. For a server-rendered document or a blog post, no h1 usually means it was missed. The tool cannot tell which kind of page you have, so it states both possibilities.
What is tag frequency good for?
Seeing at a glance what the markup is built from. A fragment full of `<div>` means layout by container nesting; lots of `<table>` means a table or an old layout; an unusual number of `<span>` usually means something pasted out of a rich-text editor and often can be simplified. It reports counts without judging — a count is not good or bad in itself, but it is the thread to pull on.
Can I use the stripped text directly?
Depends what for. It is a faithful summary of what the HTML roughly says — fine for word counts, extracts, or a quick read. But it is not the rendered result: CSS-generated content, text inserted by JavaScript and `:before` pseudo-elements are all absent. For exact rendered text, use the browser’s inspector or a headless browser.
Why are javascript: links singled out?
Because they are the one category in this breakdown with a security dimension. An `<a href="javascript:...">` executes script when clicked, is a common XSS route, and is often the trace of a broken template concatenation. Other categories are at most a style issue; this one can be a real vulnerability — so it gets its own row, shown in red with an explanation, rather than being buried under “other”.

Related tools