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.




