Irmu
Free tool

HTML to AI-ready JSON

Not the DOM, not a pile of meta tags — the content. Sections chunked by heading, Markdown, metadata and approximate token counts, ready to embed or hand to a model.

HTML input
JSON output
0 B · 0 linesExtracted locally in your browser — nothing is uploaded.
How it works

What this tool does

  • Navigation, headers, footers, scripts and styles are dropped before extraction, so you are not paying tokens for chrome.
  • Content is chunked by heading level — pick h1, h1–h2 or h1–h3 to match your embedding window.
  • Each section carries an approximate token count so you can size chunks before you spend anything.
  • The summary is taken from the page itself (meta description, or the opening paragraph) and labelled as such — no model runs here.
With Irmu

When you also need to fetch the page

A browser cannot fetch arbitrary URLs. Irmu returns the HTML — rendering, proxies and retries included — and you run the same extraction over it.

crawl_and_extract.py
# 1. Fetch the page with Irmu — rendering, proxies and retries handled for you
# 2. Extract the fields you need locally

import os, json, requests
from bs4 import BeautifulSoup

resp = requests.get(
    "https://app.irmu.com/api/crawl",
    headers={"Authorization": f"Bearer {os.environ['IRMU_API_KEY']}"},
    params={"url": "https://store.example.com/products/acme-headphones", "render": "true"},
    timeout=60,
)
resp.raise_for_status()

soup = BeautifulSoup(resp.text, "html.parser")

data = {
    "name": soup.select_one("h1").get_text(strip=True),
    "price": soup.select_one(".price").get_text(strip=True),
    "reviews": [r.get_text(strip=True) for r in soup.select(".review")],
}

print(json.dumps(data, indent=2))
Code examples

Do the same thing in your own pipeline

The equivalent extraction with the standard HTML parser in each language.

# pip install beautifulsoup4

import json
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

# pip install beautifulsoup4 markdownify

from markdownify import markdownify

for tag in soup(["script", "style", "noscript", "nav", "footer"]):
    tag.decompose()

sections, current = [], {"heading": "", "content": []}
for el in soup.find_all(["h1", "h2", "p", "li"]):
    if el.name in ("h1", "h2"):
        if current["content"]:
            sections.append({"heading": current["heading"], "content": "\n\n".join(current["content"])})
        current = {"heading": el.get_text(strip=True), "content": []}
    else:
        text = el.get_text(strip=True)
        if text:
            current["content"].append(text)
if current["content"]:
    sections.append({"heading": current["heading"], "content": "\n\n".join(current["content"])})

data = {
    "title": soup.title.get_text(strip=True) if soup.title else None,
    "sections": sections,
    "markdown": markdownify(str(soup.body)),
}

print(json.dumps(data, indent=2))
FAQ

Questions about this tool

Turn any URL into clean JSON

Fetch, render and extract with one API. 1,000 free credits every month, no card required.