I once spent an afternoon writing selectors to pull a price off a product page. Wrote the CSS path, handled the currency symbol, dealt with the sale-price-versus-list-price mess, tested it across a dozen listings. Then I opened view-source, scrolled a bit, and found the same price sitting in a <script type="application/ld+json"> block, typed, labeled, and currency-tagged. The retailer had published it there on purpose. I'd done a morning's work to reconstruct data that was already handed to me clean.

That block wasn't there for scrapers. It was there for Google. And that's exactly why it's the best starting point you have.

Retailers publish machine-readable product data for search engines

A huge share of e-commerce pages carry a structured description of the product embedded right in the HTML, separate from the visual markup. It exists so that Google, Bing, Pinterest, and every other crawler can show rich results: the price, the star rating, the in-stock badge you see under a search listing. Retailers are strongly incentivized to keep it accurate and current, because getting it wrong means losing the rich result or getting penalized for mismatched data.

There are three common shapes. JSON-LD is the one you want most, a self-contained JSON object following the schema.org vocabulary. OpenGraph tags are <meta> elements in the head, coarser but nearly universal, great for name, image, and sometimes price. Microdata is the old inline style, attributes like itemprop sprinkled through the visible HTML. All three describe the same underlying thing. JSON-LD just does it in one clean block instead of scattered across the DOM.