RegEx and Data Extraction

Web scraping and data extraction in Toronto and across Ontario: custom scrapers for public listings, registers, prices and documents, parsers that turn PDFs, exports and email into structured records, CRM synchronization without re-keying, and full-text search over document archives — pattern engineering in regular expressions and Python, scheduled, logged and lawful.

The weblistings · registersThe documentsPDFs · scans · exportsThe feedsAPIs · Excel · emailExtraction · yoursscheduled · logged · lawfulFetchpolite · rate-limited · cachedParseregex · rules · tolerant of drift1 page changed · caughtValidate · dedupeschema · reconciled · rejects loggedThe schedulenightly · logged · alertsThe searchfull text · indexedThe databaseloaded · CRM syncedLOADEDthe recordcaughtpassesloaded
Fetch politely, parse with patterns, validate what arrives. One page changes its layout and the run says so — the database is loaded anyway.
the craft, in Python, since the first pipeline
Regex the craft, in Python, since the first pipeline
runs that log, retry and tell you when a source changes
Scheduled runs that log, retry and tell you when a source changes
public data, within terms and privacy law
Lawful public data, within terms and privacy law

Pattern engineering, not scripts

Most of the world’s useful data is not in an API. It is on a public page, in a PDF, in a spreadsheet someone exports every Friday, in an email. The efficient way to structure it is still a well-written pattern — a regular expression that knows exactly what an identifier, an amount or a reference looks like — and the reason most scraping projects die is that a pattern is all they were. We build the engineering around the pattern: polite, scheduled fetching that respects the source; parsers with a test for every format we have seen; validation that refuses the malformed and logs the reject; drift detection that raises a hand when a page changes; and code in a repository you own, in Python, by the same team that builds our pipelines and integrations. HEQCO and Green Standards are two of the organizations this pattern work has served.

Public data, within the law

Extraction is worth doing only when it can be relied on, and that includes legally. We scope every source against its terms and against Canadian privacy law, keep to public, non-personal data unless you have a lawful basis for more, and design the pipeline to stay inside those lines — because the privacy rules that apply to what you collect apply to what you scrape.

What we extract, and how

The most efficient way to structure unstructured data is still a well-written pattern — and the engineering around it is what makes it last

Web scraping, done politely

Custom scrapers for public listings, registers, catalogues, prices and documents: rate-limited, cached, identified, scheduled, and written to survive the layout change that breaks the script everyone else bought. Public data, within the site’s terms and the law.

Parsers for documents and exports

PDFs, scanned reports, spreadsheet exports, email and legacy formats turned into records with a schema: regular expressions where they are the right tool, grammars and layout rules where they are not, and a test for every format we have ever seen.

CRM and database synchronization

Contacts, accounts and records moved between the CRM, the ERP and the spreadsheet without re-keying: matched, deduplicated, reconciled and written back — in Python, owned by you.

Full-text search and indexing

Text extracted from document archives and indexed so people can find things. For HEQCO, Python text extraction with cron and WP-CLI put full-text search across every PDF publication on the site.

Validation and data quality

Patterns that refuse the malformed identifier, the impossible date and the duplicate, with the rejects logged and reported rather than silently dropped — the difference between a dataset and a liability.

Pipelines that tell you when they break

Every extraction runs on a schedule, logs what it fetched and what it rejected, and raises a hand when a source changes shape. Nobody discovers in the board meeting that the numbers stopped updating in March.

How an extraction engagement runs

  1. Scope the sources

    What is public, what the terms allow, what the data is for, and where it lands. If a source cannot be used lawfully, we say so here.

  2. Prototype the patterns

    Real samples, real edge cases, and a parser you can see working in the first week — with the rejects listed so you can judge them.

  3. Harden and schedule

    Rate limits, retries, caching, drift detection, logging and tests; a run on a schedule with a report you can read.

  4. Hand over

    Code in a repository you own, documentation, and a retainer if you want us to keep it running when the sources change.

Who this is for

Research and policy organizations

Teams that need registers, publications, filings and datasets collected and structured on a schedule, with provenance kept.

Sales and operations teams

Organizations whose leads, prices, inventory or partner data arrive in websites, spreadsheets and email, and need to land in the CRM or the ERP clean.

Anyone with a document archive

Institutions with years of PDFs nobody can search, and the obligation — or the wish — to make them findable and accessible.

In our clients' words

Imran and his team developed and maintained several highly customized solutions for our company. I worked closely with Imran for over two years -- you'd be hard-pressed to find a more creative, savvy, responsive developer.
Rick Satenstein — Director of Operations, Green Standards Ltd.
Imran has been a pleasure to work with on a number of projects large and small. He's quick to respond and find solutions across multiple platforms. Highly recommend.
Marc Borins — Marketing Communications Manager, Green Standards Ltd.

All client reviews

Questions we're asked

Is web scraping legal in Canada?

Collecting public, non-personal data is generally lawful when the site’s terms and the law allow it; personal information is governed by PIPEDA and provincial privacy law, and the Privacy Commissioner has been clear that public availability does not make it free to harvest. We scope every extraction against the terms and the law, design it to stay inside them, and tell you when a request cannot. We are engineers, not lawyers; where it matters, we work with your counsel.

Why regular expressions?

Because for text with structure — identifiers, amounts, dates, addresses, references — a precise pattern is faster, more transparent and more testable than anything heavier. We use them where they are the right tool and reach for grammars, layout parsers or models where they are not; the craft is knowing which.

What happens when a website changes its layout?

The scraper notices. Every run checks what it expects to find, logs what it rejected, and alerts when the shape of a source changes, so a broken page yields a warning rather than a month of silently wrong data. Fixing the pattern is usually an hour; knowing you need to is the part most tools skip.

Can you sync our CRM with our other systems?

Yes. Matching, deduplication and reconciliation between a CRM, an ERP, a spreadsheet or a partner feed is the same discipline as extraction, in the same language. It is the work behind our Python integrations and our Odoo modules.

Do you handle scanned documents?

Yes — OCR first, then the patterns, with a confidence threshold and a human in the loop for what falls below it. Archives of scanned reports and forms are the usual case.

How is it priced?

A fixed fee for a scoped extraction after a short discovery on real samples, and a retainer to keep it running when the sources change. The variables are the number of sources, how messy they are, and how often they drift — which is why we look at samples before we quote.
Contact us

Have a hard problem and a budget?

Tell us what's driving it. You'll talk to the people who do the work.

A sentence or two is plenty: the problem, the system, the deadline.