GEO-042·Issue 04·Technical Foundation·42 / 132
Help AI Extract Correctly: HTML Semantics and Paragraph Boundaries
AI extracts DOM blocks, not your layout. Fix heading hierarchy, spec tables, and paragraph boundaries so answers quote your page instead of guessing.
Issue focusAnswer Units: Writing Category and Product Pages for GEO
Thursday morning, a US-facing DTC seller of portable power stations gets a screenshot from support. A buyer asked ChatGPT which unit would run a CPAP machine and a laptop for two nights off-grid. The answer names three models; beside their unit, the spec line reads “capacity not specified.” The page does say 1,024 Wh — inside a div grid, “Capacity” in one span, “1024” in a second, “Wh” on its own line, plus a duplicate block CSS hides on mobile. Nothing was missing. Nothing was legible to the machine.
Extraction follows the blocks your DOM declares, not the layout buyers see: semantic tags decide where the cut lands, and paragraph boundaries decide what survives it.
Extraction cuts blocks, not screens
An extraction pipeline fetches HTML, strips boilerplate, segments the rest into blocks, then selects those that answer the question. The third stage never reads your stylesheet.
Segmentation uses element boundaries — h1–h6, p, li, table, main, article. A div class="spec-title" is a container, not a heading, so its text merges into the next one. Font size and weight are invisible: the label looks like a subhead and behaves like a stray phrase.
Order breaks next. CSS order, absolute positioning, and duplicate mobile/desktop DOM decouple source from visual order. On screen the price sits under the title; in source it may sit above it, or appear twice. The extractor reads the file, the buyer reads the render; both are right, unless the crawler never runs JavaScript.
Fix boundaries, not tag count
A handful of elements carry the value. Sprinkling article and section over 300-word paragraphs changes nothing.
| Today | What extraction receives | Change to |
|---|---|---|
div class="h2" used as a subhead | Bare text glued to the previous block | h2 / h3 |
| Spec grid built from divs | Key and value may swap order or merge | table with th scope="row" |
| Price in a span, currency in another | An amount with no unit, or two facts | One element: $1,299 USD |
Claims split by <br> | One long paragraph | ul > li, one claim each |
| FAQ injected on click | Absent from source at fetch time | details / summary |
Disable CSS and read the page: if it still reads as a document, extraction has something to work with.
Two rows matter most. Keep amount and currency in one element, or the number has no denomination. An FAQ injected on click is absent at fetch time; details keeps it in the DOM while collapsed.
One answer per block, one fact per sentence
Missing tags are the visible failure. The expensive one is a paragraph carrying three answers.
Extractors cut at token windows. When one closes mid-paragraph, the conclusion may land in the dropped half. A block covering capacity, weight, and use case leaves a model two options: quote it all, too long, or abandon it.
Three rules cover most cases: open with the answer, then two sentences of evidence; one block, one question; number, unit, and condition in one sentence — “operates from 14°F to 104°F,” not “see the table.” Resolve pronouns: “it” and “this unit” lose their referent when quoted alone.
The counter-example sits on most product pages: “premium cells, high capacity, lightweight, fast charging.” Four adjectives, zero fillable values, so the answer calls the spec unavailable — accurately, at your expense.
Rewrite in five steps, source first
Sequence matters more than effort: read source, fix prose, then change tags. The reverse order yields correct markup, unchanged paragraphs, and a re-test showing nothing — after which teams blame semantic HTML.
| Step | Action | Owner | Passes when |
|---|---|---|---|
| 1 Read source | curl core pages with JS off; confirm title, price, specs, FAQ sit in the HTML in reading order | Engineering | Key fields readable without interaction |
| 2 Map blocks | One H2 per question, H3 for sub-questions, three paragraphs maximum | Content | The block answers alone |
| 3 Fix sentences | Answer first, one idea per paragraph, values with units | Content | A sentence fits one table row |
| 4 Swap tags | Specs to table, claims to li, collapsed content to details | Frontend | Extracted text still pairs label with value |
| 5 Retest | Re-run the same prompts; compare answer sentences | Growth | Sentence-level overlap, not a mention |
Step 2 is skipped most and costs most. Without a block map, step 4 is cosmetic: the table is real, the row is a run-on sentence, and the answer still says “not specified.”
Example: one spec block, before and after
Example — a fictional 1,024 Wh power station listing; figures illustrative. Before, capacity, output, and operating temperature sit in three div grids, units on separate lines, the spec sheet is a JPEG, and “can it run two devices at once” needs a click. After:
<h2>What can this 1,024 Wh unit power?</h2>
<p>Rated output is 1,800 W, enough for a 1,200 W kettle and a 60 W laptop together.</p>
<table>
<tr><th scope="row">Battery capacity</th><td>1,024 Wh</td></tr>
<tr><th scope="row">Rated output</th><td>1,800 W</td></tr>
<tr><th scope="row">Operating temperature</th><td>14°F to 104°F</td></tr>
</table>
No keyword was added. Each value gained a position, a unit, and a first sentence matching a buyer’s question. The spec line moves from “not specified” to three fillable rows because of structure.
Where this breaks
Marketplace-only sales. On Amazon or TikTok Shop you do not control the PDP source. Fix listing attributes and the feed first.
Thin facts. Semantics make empty claims easier to extract, and easier to spot. Without verifiable evidence, first-party evidence outranks markup.
Extractor variance. Boilerplate rules, chunk windows, and hidden-content handling differ by system. One failed extraction is not proof; check two or three entry points before rewriting.
Lazy loading. Content requested after a scroll is not in source, and no tag fixes what is absent — rendering comes before markup, see whether AI can render your store.
A ranking lift. Semantics raises the odds of accurate extraction, not entry to the candidate set; entities and evidence decide that.
This line continues on the technical foundation hub. For the paragraph-level counterpart, read the issue lead on the answer unit; for catalog-wide proof, use entity coverage sampling.
This month, do one thing: take your highest-traffic product page, curl its source, replace the spec grid with a real table, write the buyer’s most common question as that block’s first sentence, then re-ask and look for your sentence.