HTML to Markdown Converter
Paste the HTML of a page and read it back as clean Markdown, with headings, links, lists, tables and code blocks kept and the navigation, footers and cookie banners left out. The conversion runs in your browser: nothing you paste is uploaded and no URL is fetched.
Markdown
# Restocking the Workshop
Three things changed this month: **prices**, *lead times* and the [returns policy](/blog/returns).
## New stock
| Item | Status | Ships in |
| --- | --- | --- |
| Bench vise | In stock | 2 days |
| Chisel set | Back-ordered | 3 weeks |
## Checking stock from a script
```python
import requests
r = requests.get("https://example.com/api/stock", timeout=10)
print(r.json()["items"])
```
- Orders before noon ship the same day
- Returns: 30 days, unusedPage title found: Restocking the Workshop | Example Tools Blog
Want this from a URL, with JavaScript rendered? Node4 is building a Scrape API that will take a URL and return Markdown, HTML or a screenshot. It is in development and not available yet. Join the waitlist
What each element becomes
| HTML | Markdown |
|---|---|
| <h1> to <h6> | # to ###### headings |
| <p>, <br> | Blank-line paragraphs, hard line breaks |
| <strong>, <em>, <del> | **bold**, *italic*, ~~strikethrough~~ |
| <a href> | [text](url "title"), relative URLs resolved if you give a base URL |
| <img> | ; data: images become their alt text |
| <ul>, <ol start> | Nested - and 1. lists, numbered from the start attribute |
| <pre><code class="language-x"> | Fenced code block tagged with its language |
| <code> | Inline code, with a longer fence if the code holds backticks |
| <table> | GitHub-flavored pipe table, header row first |
| <blockquote> | > quoted blocks, nested content kept |
Scripts, styles, forms, iframes, SVG and other embeds are always dropped. Text is escaped only where a character would change the formatting, so a variable like user_id stays readable.
Where this converter stops
- JavaScript is not run, so content a page builds in the browser after load is not in pasted source.
- Cells that span rows are written once; colspan is padded with empty cells.
- Iframes, SVG, canvas, forms and embedded media are dropped.
- CSS is ignored, so text hidden by a stylesheet (rather than by the hidden attribute or aria-hidden) is kept.
Converting pages in your own code
For more than a few pages, do the same job in a script: fetch, extract the main content, convert, then chunk for retrieval. The Python guide to converting web pages to Markdown for an LLM walks through each step with runnable code, including JavaScript-rendered pages. At volume, sites start refusing a single address, which is where Node4's rotating datacenter proxies fit: each new connection can leave from a different exit. If you are deciding between running that code and calling a managed service, scraping API or proxies compares the two.
Questions
Is the HTML I paste sent anywhere?
No. The conversion runs in your browser, in this page's own JavaScript. Nothing you paste is uploaded, and no link or image in it is requested.
Can I convert a URL instead of pasted HTML?
Not with this page. It never fetches a URL, by design. To convert live pages from your own code, the Python guide linked above fetches through a proxy and converts the result. A Node4 Scrape API that takes a URL and returns Markdown is in development, and the waitlist is open.
Why is my converted page empty or missing its main text?
Many sites build their content with JavaScript after the page loads, so the HTML source holds only an empty shell. Copy the rendered HTML from your browser's developer tools (the Elements panel, then copy outerHTML on the html element) instead of using View Source.
What does main content only remove?
Navigation, site headers and footers, asides, hidden elements, and blocks whose class or id names a cookie banner, share bar, newsletter box, sidebar or similar. It keeps the main element, or the largest article when there is no main element. Turn it off to convert everything.
Is the output good enough for an LLM or RAG pipeline?
It keeps headings, lists, tables, links and code blocks, which are the structure a chunker and a model use. Check a few pages from each site by eye, because no heuristic picks the main content correctly on every layout.
More free tools
Request one URL from a datacenter IP and residential IPs at once, and see which of them gets blocked.
What your HTTP client gives away: header order, missing client hints, and contradictions with your user-agent.
Five questions and a straight answer, including when the answer is that you do not need proxies at all.
Your public IP address, the country it resolves to, reverse DNS and the headers your browser sends.
Derive how many proxies a job needs from volume, deadline, per-IP rate limit, concurrency and retries.
Check a path against a pasted robots.txt and see the exact rule that allowed or disallowed it.
Paste a curl command and read it back as Python, Node.js, Go or PHP, with the flags translated properly.
Turn a proxy host, port and credentials into working curl, Python, Node.js and Scrapy snippets.
Network address, broadcast, usable range and host counts for any CIDR prefix length.
Decode any user-agent string into browser, engine, OS and device, including bots and HTTP libraries.
Need proxies behind your code?
Node4 sells datacenter, rotating and residential proxies over HTTP(S), with SOCKS5 on paid plans. Datacenter and rotating exits are in the US, Italy and Spain; residential exits cover 170+ countries. Start with free proxies, no card required.