Browsers & softwarePractical guides

Turn platform snapshots into tables: products, ratings and source checks

Identify the source, variant and time behind each row before comparing platform prices or ratings. Four complete fictional JSON files produce two plus one product observations, three reviews and two posts. Reconcile original currencies, missing ratings and zero values, then retain a traceable handoff.

A close-up of a metal shopping cart against a light background
Illustrative photo: Bruno Kelzer · Unsplash License

What changed: Added complete two-store product, three-review and zero/missing engagement inputs, with tool steps, export lineage and per-field acceptance.

The practical answer

Keep the 2+1 product observations separate by source rather than merging shared titles/SKUs. Only two of three reviews have ratings; zero likes differs from an absent count. Reconcile each row export and retain the JSON envelope containing sourceUrl, source, mode and collectedAt. Parsing time does not establish historical observation time.

Start with a source ledger for all four inputs

Domains, products, reviews and posts are fictional. source-manifest.json gives the tool, Source URL and expected count for every file. Use pasted source or file import rather than trying to collect these example domains online.

  1. Process store-a-products.json and store-b-products.json separately in platform product collection, with https://shop-a.example/catalog and https://shop-b.example/catalog respectively.
  2. Use review collection for reviews.json with https://reviews.example/tea, and social collection for social.json with https://posts.example/team.
  3. Choose pasted source or import, load the complete file and select Parse content. Source text is sent to the KitNelo parsing service; this is not offline browser processing.
  4. For each run retain JSON plus CSV or Excel, linking input and output filenames. Do not combine counts from these different tasks into one business unit.

Choose the operation for this step

  • Collect product snapshots: Preserve SKU, variant, currency and collection time; a displayed price is not necessarily the final checkout price or a live feed.
  • Organize review records: Keep the original rating and its minimum and maximum scale, plus source and date; do not compare 4/5 directly with 4/10.
  • Extract article records: Verify author, publication time and body completeness against the source; static HTML may omit dynamically loaded material.
  • Inspect video metadata: Treat extracted duration, cover and public URL as metadata, and do not assume the tool downloads video or verifies playback statistics.
  • Organize social posts: Keep author, post time and source-provided engagement fields; missing counts should remain missing rather than becoming zero.

Define each file’s answer before accepting the preview

Seeing a table is insufficient. Store A has two product rows and store B one. Three reviews have two supplied ratings and one missing rating. Of two posts, one explicitly has zero likes and one supplies no count. Entirely empty fields may disappear from preview but still need export review.

Separate acceptance by file and record unit
InputRecordsCritical values
store-a / store-b2 / 1 product observationsUSD 12.00, USD 20.00 / EUR 11.00
reviews3 reviews4/5, 6/10, absent; not three known ratings
social2 postslikes string 0 and blank; not two zeros

Complete product inputs: the same SKU can describe separate observations

Process store A’s variants separately from store B. TEA-100 repeats across stores and is not a global identifier; neither SKU nor Demo tea alone justifies merging. Keep original currencies rather than ranking USD 12 and EUR 11 as the same monetary unit.

Complete store-a-products.json

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Demo tea",
  "hasVariant": [
    {
      "@type": "Product",
      "name": "Demo tea 100g",
      "sku": "TEA-100",
      "offers": {
        "@type": "Offer",
        "price": "12.00",
        "priceCurrency": "USD",
        "url": "/products/tea-100"
      }
    },
    {
      "@type": "Product",
      "name": "Demo tea 200g",
      "sku": "TEA-200",
      "offers": {
        "@type": "Offer",
        "price": "20.00",
        "priceCurrency": "USD",
        "url": "/products/tea-200"
      }
    }
  ]
}
A ProductGroup/hasVariant teaching example with two variants. Use the ledger’s Source URL.

Complete store-b-products.json

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Demo tea 100g",
  "sku": "TEA-100",
  "offers": {
    "@type": "Offer",
    "price": "11.00",
    "priceCurrency": "EUR",
    "url": "/products/tea-100"
  }
}
A separate fictional store shares a SKU but has a different source and currency.

Per-row product export answers
Source / SKUNameprice / currencyExported product URL
shop-a / TEA-100Demo tea 100g12.00 / USDhttps://shop-a.example/products/tea-100
shop-a / TEA-200Demo tea 200g20.00 / USDhttps://shop-a.example/products/tea-200
shop-b / TEA-100Demo tea 100g11.00 / EURhttps://shop-b.example/products/tea-100

Schema.org’s ProductGroup reference describes groups and variants. This exercise reconciles supplied snapshots, not checkout prices, shipping or live inventory.

Three reviews supply two ratings: retain their scales first

Process the complete reviews.json in review collection. Expect Review A/B/C, with rating 4, 6 and blank; worstRating 1, 0 and blank; bestRating 5, 10 and blank. C supplies no rating. Do not fill zero or include it among known-rating observations.

Value divided by maximum gives A 80% and B 60%. Position within the stated interval gives A (4−1)/(5−1)=75% and B (6−0)/(10−0)=60%. These metrics differ; raw 4 and 6 also cannot be averaged into a common star scale. Known-rating coverage is 2/3 of this input, not coverage of all platform reviews.

Complete reviews.json

[
  {
    "@type": "Review",
    "name": "Review A",
    "reviewBody": "Fictional review A.",
    "reviewRating": {
      "ratingValue": 4,
      "worstRating": 1,
      "bestRating": 5
    }
  },
  {
    "@type": "Review",
    "name": "Review B",
    "reviewBody": "Fictional review B.",
    "reviewRating": {
      "ratingValue": 6,
      "worstRating": 0,
      "bestRating": 10
    }
  },
  {
    "@type": "Review",
    "name": "Review C",
    "reviewBody": "Fictional review C has no rating."
  }
]
Three fictional reviews; the third has no reviewRating. Leave missing fields unresolved.

Schema.org Rating distinguishes ratingValue, bestRating and worstRating. The two calculations are explicitly stated editorial comparison methods; the collector does not create a trustworthy cross-platform average for you.

Keep the JSON envelope and separate parsing from observation time

Process social.json next: the first record explicitly has zero likes; the second omits likes. Expect 0 and blank. Preview may omit entirely empty columns such as comments, but CSV/Excel and JSON preserve those fields. Visible column count is not completeness evidence.

The JSON download contains sourceUrl, source, mode, collectedAt and result, with rows at result.items. CSV/Excel primarily contain rows. A product row’s url is often its product page, not the imported catalog URL. Keep the envelope or a separate filename/source ledger.

collectedAt records this parsing operation. October 1/2 in the ledger are fictional observation labels, not verified historical prices. Parsing today does not establish that history; importing an old file does not refresh live platform data. A source value of paste does not establish an online collection.

Complete social.json

[
  {
    "@type": "SocialMediaPosting",
    "articleBody": "Fictional post A",
    "likes": 0
  },
  {
    "@type": "SocialMediaPosting",
    "articleBody": "Fictional post B"
  }
]
One explicit zero and one absent count, both editorial examples.

Use the source-boundary guide for evidence scope and missing-versus-zero checks for absent fields rather than inventing counts.

Reconcile each file and retain unresolved provenance

Keep four original JSON inputs, their ledger, four parsed JSON envelopes and the required row tables. Correct a wrong Source URL or input by parsing a new version rather than editing only a display label in the output.

Accepting this snapshot handoff

  • Product 2+1 rows retain two sources, three URLs and original currencies, without cross-store title/SKU merging.
  • Three reviews retain two supplied scales; the missing rating remains missing and known-rating coverage is labeled 2/3.
  • The two posts distinguish zero from absent likes; hidden preview columns were not mistaken for absent fields.
  • Each row export maps to its JSON envelope; parsing time differs from fictional observation labels.
  • Do not describe imports as official API connections, continuous monitoring or complete platform coverage; follow source scope and missing-value rules.

Common questions

Is an extracted price current forever?

No. Keep the observation time and recheck the original source for a current decision.

Does a video record include the video file?

A metadata record does not establish that the media was downloaded or licensed for reuse.

Can unavailable counts be set to zero?

No. Zero is an observed quantity, while unavailable means no supported value was obtained.

Further reading & sources

Put the guide into practice

Open the relevant tool, preview the result and check your exported file.

Related articles