Skip to main content

Heading Structure Extractor

See each page's heading outline.

How to use the Heading Structure Extractor, step by step

Real screenshots of the current tool, using sample inputs. Long results are shown as a preview.

  1. 1

    Add your input

    Paste or type into the field Heading Structure Extractor works from.

    Heading Structure Extractor in its default state before the walkthrough
  2. 2

    A page URL in place

    With a page URL entered, Heading Structure Extractor is ready to run.

    Heading Structure Extractor with sample input or settings in place
  3. 3

    Review the result

    Select Extract structure to run the tool. This screenshot shows the result returned for the sample input.

    Heading Structure Extractor showing its actual result with sample inputs

What the Heading Structure Extractor does

Auditing heading structure one URL at a time is fine for a single check, but tedious when you are reviewing your top 20 organic pages or studying 5 competitors before writing a new pillar post. The Heading Structure Extractor takes a list of URLs and returns each page's nested H1-H6 outline in one view.

Each result is a collapsible accordion: click a URL to see its per-tag count summary plus the indented hierarchy. Compare side by side. Copy any page's outline. Spot missing H1s, duplicate H1s, and skipped levels at a glance. The bulk view is what makes competitor outline analysis fast enough to be worth doing.

How to extract outlines

Five steps from URL list to clean outlines.

1

Paste URLs (one per line)

Drop in 5-15 public URLs. Your own pages, competitors, a mix. Public URLs only.

2

Click Extract Structure

The tool fetches each URL server-side and parses every H1-H6 in the rendered HTML.

3

Click any URL row

Each result expands to show the per-tag count summary and the nested outline.

4

Copy or compare

Use the Copy button to grab a single URL's outline, or open multiple to compare side by side.

5

Edit and re-extract

Make CMS fixes for problem URLs, paste them again, confirm clean outlines.

When SEO teams use it

Six common workflows where bulk outline extraction earns its keep.

Auditing competitor outlines for a new pillar post

Run the top 5 SERP results for your target keyword. The H2 patterns you see are what Google currently rewards for that intent. Build your outline to match the patterns plus add one section nobody else covers.

Bulk QA across your top organic pages

Audit your top 20 organic pages quarterly. Run them through the extractor in one batch. The outliers (multiple H1s, skipped levels, 30+ H2s) become your priority fix list.

Theme migration regression check

Migrating from one CMS theme to another. Run a representative sample of post types and pages before and after the switch. Diff the outlines. Anywhere the theme broke the heading structure, you catch it before SEO impact.

Inventorying a newly inherited site

You took over a 200-page site and need a content audit. Run the top 30 organic pages through the extractor; the outline diff against intended structure is your audit report's opening section.

Pre-publish content QA across multiple staging URLs

Your team has 6 posts queued for publish this week. Paste all staging URLs in one batch, see all 6 outlines side by side. Catch structure issues before publish.

Accessibility compliance check

WCAG 2.1 AA flags heading hierarchy issues. Run all template pages through the extractor; pages with broken outlines fail accessibility audits. The fix is usually one CSS or template-tag change.

Platform-specific setup guides

How to deploy structural fixes across the CMSes most teams use.

WordPress

  1. Run your top 20 organic URLs through the extractor monthly. Common issues: theme wrapping logo as H1, footer widgets contributing H3s.
  2. Fix in header.php (logo) and footer.php (widget titles). Use CSS to keep visuals identical, only change the tag from H to p.
  3. Re-run extraction after the fix to confirm clean outlines.

Webflow

  1. Run all CMS template pages plus key static pages. Webflow is generally clean, but custom templates can introduce extra H1s in symbols.
  2. Fix in Designer: change tags on Heading elements via the dropdown. CMS items inherit from their template.
  3. Publish, re-run extraction to confirm.

Ghost

  1. Run all post URLs plus the homepage and any custom pages. Ghost themes usually keep things clean.
  2. If a custom theme introduced extra H1s in the header or sidebar, edit the .hbs template and change H tags to span/p.
  3. Re-run extraction. Ghost theme changes deploy on save.

Next.js / React custom builds

  1. Run all routes by category: home, marketing, docs, blog. Single-page apps are the most common cause of "no headings detected".
  2. Confirm getStaticProps or getServerSideProps fills H tags into the SSR HTML, not just JSON.
  3. Re-run extraction. JS-only renders are the typical culprit; SSR fixes it.

Squarespace / Wix

  1. These platforms hide tag selection in style panels. Look for "Heading 1/2/3" labels in text editor toolbars.
  2. Audit all template pages plus your top organic pages. Limited fix options exist if the platform hardcodes site logo as H1.
  3. Run extraction to identify which template pages have outline issues; prioritize fixes by SEO traffic.

Grigora vs. other extractors

A side-by-side of the alternatives.

CapabilityGrigoraScreaming FrogSEMrush AuditFree generatorsManual
Bulk URL extractionYes (5-15)Yes (paid)Single URLSingle URLManual
Free + unlimitedYesLimited freeFree trialFree, ad-supportedManual only
Nested hierarchy viewYesYesYesFlat listManual
All H1-H6 tagsYesYesYesH1-H3 onlyManual
Per-URL summaryYesYesYesYesManual
Copy outlinesYesYes (paid)YesYesManual
No signupYesAccount requiredAccount requiredYesYes
Result speed<10 sec for 5 URLs<60 sec<5 sec single<5 sec singleManual

Common errors and how to fix them

Eight issues SEOs hit when running bulk outline audits.

Extraction returns no headings for a URL that clearly has them

Cause: Page is a single-page app that injects content via JavaScript after initial render.

Fix: For SPAs, server-render the headings (Next.js getStaticProps, Nuxt asyncData, etc.). If the page cannot be SSRed, this tool will miss headings. Use a Lighthouse audit run from a real browser instead.

Outline includes navigation or footer headings

Cause: Theme uses H2 or H3 for "Recent posts", footer column titles, or sidebar widgets.

Fix: Convert non-content headings to <p> with a heading-style CSS class. Reserve real heading tags for the article body. Sidebars and footers should not contribute to the page outline.

Multiple H1s detected on one URL

Cause: Theme wraps both site logo and post title in H1, or you have an article H1 plus a sidebar H1.

Fix: In your theme, change the logo to <p class="site-title">. Keep one H1 per page representing the actual page topic.

Skipped heading level (H2 to H4)

Cause: A developer or content team picked H4 because it "looked the right size", ignoring the missing H3.

Fix: Either insert an H3 or demote the H4 to H3. Use CSS for visual size; keep the tag semantically correct.

One URL fails to load while the rest succeed

Cause: Target server is slow, behind a strict WAF, or rate-limiting our resolver.

Fix: Retry that URL alone after 30 seconds. If it persistently fails, the site is blocking automated fetches; load the page yourself and view source manually.

Headings show HTML entities (&amp;)

Cause: Source HTML uses entity encoding for special characters.

Fix: No fix needed, the encoding is fine. & renders as & in browsers and is read identically by Google. The output preserves raw HTML for transparency.

Page has 30+ H2s

Cause: You used H2s for every visual subheading without an H3 layer.

Fix: Group related H2s under broader H2s, demoting the inner ones to H3. A 30-H2 page reads as a flat list of equal-weight topics; structure matters more than count.

Structure changes between fetches

Cause: CMS A/B test, dynamic content, or you edited the page between extractions.

Fix: Re-run extraction. If the structure is genuinely changing per request (rare), pin the variant in the CMS or set a feature flag.

Original data from our 2026 outline study

What we observed across 4,000 random URLs run through bulk extraction.

23
Average headings per public web page (sample n=4,000)
8
Median H2 count on top-3 SERP pages
38%
Pages with at least one structure issue
14 min
Time saved auditing 10 URLs vs. one-at-a-time

Frequently asked questions

Twelve answers covering the most-asked questions about bulk outline extraction.

The Heading Structure Extractor takes multiple URLs at once (one per line) and returns each page's outline as a collapsible accordion. Single-URL checkers do one page at a time, which is fine for spot-checks but tedious when you are auditing 10 competitors or your own top 20 organic pages. Both tools parse the same HTML; the bulk version saves you the page-load roundtrip.
There is no hard limit, but practically 5-15 URLs is the sweet spot. Beyond 20 URLs the page becomes hard to scan visually, and individual URL fetches start to time out cumulatively. For larger crawls (100+ URLs) use Screaming Frog or a paid SEO suite.
No, it parses server-rendered HTML. Headings injected purely by client-side JavaScript (after window load) will be missed. Most marketing pages, blogs, and CMS-rendered sites have all their headings server-side; only single-page apps that lazy-load content into the DOM will return partial results.
Run the top 5-10 ranking competitors for your target keyword through the extractor. Their H2 list tells you what subtopics Google currently rewards for that query. Look for patterns: every competitor has an H2 about pricing? Add one. Every competitor avoids H2s about features? Lead with features yourself to differentiate. The outline is a free competitive intelligence layer.
Skipping happens when you go from H2 directly to H4 without an H3. The hierarchy view in the result indents each tag by its level, if you see an H4 indented two layers deeper than the H2 above, with no H3 between, the skip is visible at a glance. Fix by either inserting an H3 or demoting the H4 to H3.
Nesting groups related sections under their parent H2, which is how the page actually reads. A flat list of every heading hides the relationship. Click any H1 or H2 in the result to expand its children, that is the same mental model as a Notion or Word document outline view.
About 2-4 seconds per URL. Ten URLs take roughly 30 seconds because we fetch in parallel where possible. If a URL is hosted on a slow server, that single URL slows the whole batch. For impatient bulk runs, split your list into batches of 5.
Each result has a Copy button that copies the page's headings as plain-text "H1: title", "H2: section title", etc. Paste into a Google Doc or Notion for further analysis. There is no CSV export yet, for that, use Screaming Frog.
The summary at the top of each result shows H1 count. If H1=0 or H1=2+, that is your visual flag. Click in to see what is happening. We do not pop a banner for every issue because experienced SEOs prefer compact data; new SEOs should learn to read the count themselves.
You are refreshing a 2022 post that is sliding in ranking. Run the post URL plus the top 5 current SERP results through the extractor. Compare your H2 list to theirs. Sections you are missing? Add them. Sections you have that nobody else does? Consider whether they earn their place. The outline diff is often where the content gap lives.
No. We fetch the public HTML the same way an anonymous browser would. Behind-paywall pages return whatever the public version includes (usually just the title and a paywall CTA, not the full article structure). Audit only the public URLs in your portfolio.
Themes, plugins, and CMS templates can wrap your headings unexpectedly. Run your URL, look at what is actually rendered, compare to what you intended. The most common surprise: footer columns, sidebars, or "related posts" widgets contributing H2s/H3s to your page outline. Convert those to non-heading tags in your theme to clean up.

Related free tools

Other utilities that pair well with the Heading Structure Extractor.

Audit a batch of URLs right now

Paste your top 5 organic pages and 5 competitors. See the diff. Free, unlimited, no signup.

Try the Heading Structure Extractor