SEO Friendly HTML Structure

Search engines read markup, not screenshots. The structural decisions that make a page understandable to a crawler are the same ones that make it understandable to a person.

Concept

Search engines read the HTML. Everything they conclude about a page comes from the elements you chose, the order you put them in and the text inside them.

The convenient part is that markup which is good for search is the same markup that is good for accessibility and for maintenance. There is no separate SEO markup, and anyone selling one is selling something else.

The structural checklist

One h1 that describes the page

<!-- weak: describes the site, identical on every page -->
<h1>Riverside College</h1>

<!-- good: describes this page -->
<h1>Design course</h1>

The h1 is one of the strongest on page indications of what a document covers. Wasting it on the site name, which already appears in the title and the header, throws that away.

A heading structure that reads as an outline

<h1>Design course</h1>
  <h2>What you will study</h2>
    <h3>Year one</h3>
    <h3>Year two</h3>
  <h2>How to apply</h2>
    <h3>Eligibility</h3>
    <h3>Documents required</h3>
  <h2>Fees</h2>

Featured snippets are frequently assembled from a heading and the paragraph beneath it. Writing headings as the questions people actually ask is a direct way to be eligible for them.

Content in main

<body>
  <header><nav>...</nav></header>
  <main>
    <h1>Design course</h1>
    <article>...</article>
  </main>
  <footer>...</footer>
</body>

Text inside main is the page. Text inside nav or footer is repeated furniture, present on every page, and weighted accordingly.

Content in the initial HTML

Google renders JavaScript, but rendering is a second pass that can be delayed. Content that exists only after a client side fetch may be crawled as an empty page.

<!-- risky: a crawler on the first pass sees nothing -->
<div id="app"></div>
<script src="/app.js"></script>

<!-- safe: the content is in the response -->
<main>
  <h1>Design course</h1>
  <p>A three year studio based course.</p>
</main>

Server side rendering or static generation solves this. If a page is important for search, its content should be in the HTML the server sends.

<!-- not a link: never followed, never crawled -->
<div onclick="location.href='/courses'">Courses</div>
<span data-href="/courses">Courses</span>

<!-- a link -->
<a href="/courses">Courses</a>

Discovery happens through a elements with href attributes. Nothing else counts.

The text inside a link tells a crawler what the destination page is about. Read more, twelve times on one page, tells it nothing.

Clean, readable URLs

Poor:  /page.php?id=4837&cat=12&ref=nav
Good:  /courses/design
  • Lower case, words separated by hyphens.
  • Short and descriptive.
  • A logical hierarchy that matches the site structure.
  • Stable. A changed URL loses everything unless it is redirected.

Semantic elements throughout

Lists as lists, tables as tables, quotes as blockquotes, dates in time elements. Each one gives a crawler a small piece of structure it cannot otherwise infer.

A page that gets all of it right

<!DOCTYPE html>
<html lang="en-IN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Design Course - Riverside College</title>
  <meta name="description" content="A three year studio based design course in Pune. Sixty places, applications open 1 June.">
  <link rel="canonical" href="https://example.edu/courses/design">
</head>
<body>
  <header>
    <a href="/"><img src="/logo.svg" alt="Riverside College home" width="140" height="40"></a>
    <nav aria-label="Main">
      <ul><li><a href="/courses">Courses</a></li></ul>
    </nav>
  </header>

  <nav aria-label="Breadcrumb">
    <ol>
      <li><a href="/">Home</a></li>
      <li><a href="/courses">Courses</a></li>
      <li><a href="/courses/design" aria-current="page">Design</a></li>
    </ol>
  </nav>

  <main>
    <article>
      <h1>Design course</h1>
      <p>Published <time datetime="2026-03-02">2 March 2026</time></p>

      <h2>What you will study</h2>
      <p>...</p>

      <h2>How to apply</h2>
      <ol>
        <li>Fill in the application form.</li>
        <li>Pay the fee.</li>
      </ol>

      <p>See also the <a href="/courses/data">data science course</a>.</p>
    </article>
  </main>

  <footer>
    <p><small>Riverside College, Pune</small></p>
  </footer>
</body>
</html>

Content quality still decides most of it

Markup makes a page understandable. It does not make it worth reading, and worth reading is the larger factor by a wide margin.

Google describes what it rewards in terms of experience, expertise, authoritativeness and trust. In practice that means:

  • The page answers the question someone actually had.
  • It is specific rather than generic.
  • It is written by someone who knows the subject.
  • It is kept current.
  • It says who wrote it and when.

No amount of markup rescues a page that has nothing to say.

Important rules

  • Crawlers read markup, not appearance.
  • One h1, no skipped levels.
  • Only a href is a link.
  • Content in the initial HTML is indexed reliably; content added by script may not be.
  • URLs should be stable; changing one requires a redirect.
  • Do not block CSS or JavaScript from crawling, or the page cannot be rendered correctly.

Common mistakes

  • The site name as the h1 on every page.
  • Heading levels chosen by size.
  • Clickable div elements as navigation.
  • Everything rendered client side.
  • Query string URLs with no readable structure.
  • Changing URLs without redirects.
  • Text placed inside images.

Best practices

  • One descriptive h1, then a clean heading outline.
  • Main content inside main, early in the source.
  • Server render anything that matters for search.
  • Real links with descriptive text.
  • Clean, hyphenated, stable URLs.
  • Write headings as the questions readers ask.
  • Say who wrote the page and when.

Practice

  1. List the headings on one of your pages in order. Does it read as a table of contents?
  2. Disable JavaScript and reload. What content survived?
  3. Find a clickable element on your site that is not a real link and fix it.
  4. Rewrite three section headings as questions someone would type into a search box.

Useful resources

Hand picked references for this topic
Written by Lorens Mishra

Default administrator account created by the installer.

Continue reading

All HTML notes →
HTML

Image SEO

Image search sends real traffic, and images are usually the heaviest thing on a page. File names, alt text, formats and dimensions are the whole job.

Read more

Discussion

0 comments
Sign in to join the discussion.

No comments yet. Be the first to say something.