Six false positives, one commit away from being published as a bug report against my own content.

The regex was supposed to pull every worked proportion out of my site and check the answer. It matched x = 60 ÷ 4 and reported the answer as 60. It matched 4x = 60 and reported the answer as 60. Both times it grabbed a step and called it a result. The pages were correct.

Which is the useful part of this post. Not the arithmetic. The fact that an extractor that cannot distinguish a step from an answer will never fail to find errors — it will find exactly as many as it is confused by.

Once that was fixed, the census underneath it was worth keeping.

What I crawled

Fifty URLs from sitemap.xml on my own proportion calculator. Sequential curl, 300 ms apart, through a proxy. Sequential matters: the box behind this is 1 vCPU shared with seventeen other sites, and eight threads turned a clean crawl into twenty-eight mixed timeouts and fake 404s the first time I tried this in October.

Four of the fifty timed out on request one. All four answered 200 on retry.

NUM = r"-?\d+(?:\.\d+)?" PROP = re.compile(r"(?<![\d./])(%s)\s*/\s*(%s)\s*=\s*x\s*/\s*(%s)" % (NUM, NUM, NUM)) 

That negative lookbehind is doing more work than it looks like. Without it, 40/125 = x/5 inside the sentence "4/12.5 or 40/125" gets matched starting at the wrong digit and you inherit a phantom equation. Also: it will not match -3/4, because a leading minus is a guess about whether the minus belongs to the numerator or the whole fraction. I left that unhandled rather than wrong.

The count that surprised me

Thirty equations. Fourteen distinct. 3/4 = x/20 thirteen times — 43% of every worked example on fifty pages.

Forty of fifty pages contain no equation at all. Six pages carry twenty-five of the thirty.

Page Count
proportions-with-decimals 6
how-to-cross-multiply 6
proportion-formula 4
how-to-solve-proportions 4
homepage 3

And the part that killed my working theory: pages without an equation average 1,068 words. Pages with one average 1,115. Four percent. These are not thin pages. Someone wrote eleven hundred words about proportions and never put a fraction in them.

The duplicate-title thing I was sure about

Six posts, six titles, all variations of "solve for x in a fraction". In a list they look like spun content.

Five-word shingles, 33 posts, 528 pairs, Jaccard:

def shingles(text, n=5): w = re.findall(r"[a-z0-9]+", text.lower()) return set(tuple(w[i:i+n]) for i in range(len(w) - n + 1)) 

Max similarity: 0.055. Not one pair above 0.30.

They are different articles. My instinct about my own site was wrong, and 528 comparisons is what it cost to find that out — about four seconds of CPU.

What I did not test

The calculator. Only the prose.

Every page serves zero type="number" inputs and one <svg>. The tool assembles itself in JavaScript after load, so curl sees an empty shell. Whether the fraction parser accepts 1 1/2, whether it silently rounds, whether the steps panel survives a 375px viewport — none of that is in the HTML, and I did not open a browser for this post.

The crawl audits words. It says nothing about whether the thing works.

Disclosure

proportioncalculatoronline.com is mine. That is why there is a sitemap to crawl and no rate limit to respect.

The page with the most worked examples, and the only one where the reader has to think: proportion calculator.

Fourteen distinct equations for fifty pages is a shortage of examples, not a shortage of words. The decimals page already solved it — six equations, no repeats, a different shape in each one. The other forty pages need that habit, not more paragraphs.