Irmu
Free tool

HTML to plain text converter

Paste HTML on the left, get clean readable text on the right. Free, no signup, and your HTML never leaves your browser.

HTML input
Plain text output
0 characters · 0 words · 0 linesConverted locally in your browser — nothing is uploaded.
Code examples

Do the same thing in your own pipeline

The tool above parses the document in the browser. Here is the equivalent extraction with the standard parser in each language.

# pip install beautifulsoup4

from bs4 import BeautifulSoup

html = """
<h1>Shipping a crawler</h1>
<p>Retry transient failures with <strong>jitter</strong>.</p>
<ul><li>Cap concurrency</li><li>Log status codes</li></ul>
<script>tracking()</script>
"""

soup = BeautifulSoup(html, "html.parser")
for tag in soup(["script", "style", "noscript"]):
    tag.decompose()

text = soup.get_text(separator="\n", strip=True)
print(text)
How it works

What the converter does to your HTML

  • Scripts, styles, noscript, iframes, SVGs and comments are removed first, so no code ends up in the text.
  • Block elements become line breaks, so paragraphs, headings and list items stay on their own lines instead of running together.
  • Links can keep their URL inline, or collapse to just the anchor text.
  • List items get bullets or numbers, and nested lists stay indented.
  • Optional hard wrapping at 72, 80 or 100 characters for plain-text email and terminal output.
With Irmu

When you also need to fetch the page

Irmu returns the page HTML — rendering, proxies and retries included. Reduce it to text with the same parsers above.

crawl_to_text.py
# 1. Fetch the page with Irmu (rendering, proxies and retries handled for you)
# 2. Reduce the HTML to plain text locally

import os, 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://example.com/article", "render": "true"},
    timeout=60,
)
resp.raise_for_status()

soup = BeautifulSoup(resp.text, "html.parser")
for tag in soup(["script", "style", "noscript"]):
    tag.decompose()

print(soup.get_text(separator="\n", strip=True)[:500])
FAQ

Questions about this tool

Turn any URL into clean data

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