URL Extractor from Text
Paste anything with links in it — an email, a chat log, meeting notes, a data export — and get back every web address it contains, with the line it came from. Everything happens in this browser tab.
- You provide
- Pasted text, or a local TXT, CSV, TSV, JSON or Markdown file.
- You receive
- Every web address found, with its line number, in the order it appeared.
- Use it when
- Use it when the links are sitting inside prose, an email, a chat log or a data export.
Drag a file here, or
TXT, CSV, TSV, JSON or Markdown · up to 10 MB
Your text is parsed in this browser tab. Nothing is uploaded and nothing is stored.
What this tool cannot do
- A plain CSV holds only the text you can see. If a spreadsheet cell shows “Click here” with a hidden link behind it, that target is not in the CSV at all.
- Bare domains (example.com, with no scheme and no www) are off by default because they are genuinely ambiguous — main.py and shop.io both look like domains.
- An address that is split across two lines by the original formatting is read as two fragments, because that is what the text contains.
- Files are read up to 10 MB. Larger text files should be split first.
How this tool reads your text
Most "extract URLs" tools are a single regular expression. That works until it doesn't, and the failures are always the same handful of cases: a full stop at the end of a sentence gets swallowed into the address, a Wikipedia link with brackets in its path gets cut in half, or a markdown link loses its closing parenthesis.
This tool splits the job into three steps instead.
First it finds candidate starting points — an explicit https://, a www. label, an email address, or (only if you ask) a bare domain. Then it extends each one until it reaches a character that cannot appear in an address written in prose. Finally it trims trailing punctuation, counting brackets as it goes so that balanced ones survive.
That last step is where the difference shows up:
| What you paste | What comes out | Why |
|---|---|---|
| Visit https://example.com/pricing. | https://example.com/pricing | A single trailing full stop is sentence punctuation. |
| (https://example.com/terms) | https://example.com/terms | The closing bracket has no opener inside the address. |
| https://reference.example.org/wiki/Extraction_(data) | https://reference.example.org/wiki/Extraction_(data) | The brackets are balanced, so they belong to the path. |
| [docs](https://example.com/docs) | https://example.com/docs | Markdown syntax, same unbalanced-bracket rule. |
| <https://example.com/x> | https://example.com/x | Angle brackets always end a run. |
Whenever a character is removed, the row says so in its Notes column. Nothing is quietly rewritten.
What counts as a link
By default the tool accepts addresses with an explicit http:// or https:// scheme, plus anything starting with a www. label. For the www. case it adds https:// so the address can be parsed, and flags the row — the site may genuinely be http-only, and we do not know which.
Bare domains are a separate, opt-in mode. When you turn it on, each candidate is checked against the Public Suffix List, so example.co.in is accepted while notes.txt and report.pdf are not. Be aware that .py, .sh and .io are all real top-level domains, so main.py will be accepted in that mode. That ambiguity is exactly why it is off by default.
Using it
- 1
Paste your text, or open a file
Drag a TXT, CSV, TSV, JSON or Markdown file onto the drop zone, or paste directly. A file starts extraction as soon as it loads.
- 2
Adjust the options if you need to
Advanced options control whether
www.hosts, bare domains and email addresses are recognised, and let you keep or drop specific domains. - 3
Review, then copy or export
Duplicates are collapsed into a single row with an occurrence count. Filter by keyword or domain, select the rows you want, then copy them or download TXT, CSV or JSON. The export always contains the full selection, not just the rows on screen.
Frequently asked questions
Is my text uploaded anywhere?
No. The parsing runs in this browser tab, in JavaScript. Nothing you paste is sent to our server, and nothing is stored. You can confirm this by opening your browser’s network panel and extracting — no request is made.
Why is the same address listed only once?
Identical addresses are collapsed into one row with an occurrence count, so a long document does not produce hundreds of identical lines. The counts add up to the total shown as “found”. Addresses that differ in any way — including capitalisation of the path, or a different query string — stay separate, because they are genuinely different addresses.
Why was a link with brackets cut short?
It should not be, if the brackets are balanced. The tool counts opening and closing brackets inside the candidate and only removes a closing one when there is no matching opener. If you have found a case where it gets this wrong, the bug report page is the fastest way to tell us.
Can it read links out of a Word document or a PDF?
Not directly. Copying text out of Word and pasting it here works for addresses that are written out in full. For a PDF, use the PDF tool, which reads the clickable link annotations and their page numbers.
What happens to an address with a javascript: or data: scheme?
The scanner only accepts runs that begin with a supported scheme followed by ://, so a bare javascript: never becomes a row. Where one does appear — for example in the HTML tool — it is listed as text, marked unsafe, and is never turned into a clickable link.
Related tools
- You provide:
- A list of URLs, one per line.
- You receive:
- The de-duplicated list, plus a preview of exactly which entries were removed and which entry they matched.
- Use it when:
- Use it after combining exports from several sources, or before importing a list somewhere that rejects duplicates.
- You provide:
- A list of URLs, or mixed text containing them.
- You receive:
- The hostname, or the registrable root domain, for each entry — with counts and an option to keep only unique values.
- Use it when:
- Use it to see which sites a link list actually points at, or to group thousands of URLs by domain.
- You provide:
- A list of URLs, one per line.
- You receive:
- The cleaned list, with a before/after view of every address that changed.
- Use it when:
- Use it before sharing links, publishing a reference list, or importing URLs that would otherwise carry campaign parameters.
- You provide:
- Pasted HTML source, or a local .html file.
- You receive:
- Each link with its href, visible anchor text, rel and target — plus image and media references if you ask for them.
- Use it when:
- Use it when you already have the markup: a saved page, a "view source" copy, or an email template.
Guides for this tool
- How to Extract and Copy Links in ChromeWhat Chrome can do on its own, a bookmarklet you can read before you use it, and an honest look at when an extension is worth the permissions it asks for.
- How to Extract URLs with RegexPatterns that work, measured failures from the ones that do not, and a clear account of why no regular expression can fully validate a URL.
- How to Extract URLs from Text Using PythonA working extractor in about thirty lines — find candidates, trim punctuation without breaking balanced brackets, then validate with urlparse rather than trusting the pattern.
- How to Extract URLs and Domains from Text in Google SheetsFormulas that pull addresses out of a text column, get the hostname, and — importantly — why the popular "root domain" formula is wrong for half the internet.