技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
markdown-new【数据与研究】Convert any public URL into clean, LLM-ready Markdown using the markdown.new service. Use for content extraction, RAG ingestion, article summarization, research, archiving, and token-efficient web reading.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Convert public web pages into clean Markdown via markdown.new — a free hosted service that strips navigation, ads, and boilerplate, returning only the readable content.
Use it when you need:
Prepend https://markdown.new/ to any URL:
# Basic conversion
curl -s 'https://markdown.new/https://www.bbc.com/news/technology'
# With options
curl -s 'https://markdown.new/https://react.dev/learn?method=browser&retain_images=true'
curl -s -X POST https://markdown.new/ \
-H 'Content-Type: application/json' \
-d '{
"url": "https://www.bbc.com/news/technology",
"method": "auto",
"retain_images": false
}'
| Parameter | Values | Default | Description |
|---|---|---|---|
method | auto, ai, browser | auto | Conversion pipeline |
retain_images | true, false | false | Keep image links in output |
auto — fastest; lets the service pick the best pipeline. Use first.ai — forces Workers AI HTML-to-Markdown conversion. Good for well-structured HTML.browser — headless browser rendering. Use for JavaScript-heavy SPAs and pages where auto misses content.Strategy: Always try auto first. Fall back to browser only when output is incomplete or empty.
The response is text/markdown with YAML frontmatter (title and page metadata) followed by the converted content. Internally the service tries three tiers in order: a direct Accept: text/markdown request to the site, Workers AI HTML-to-Markdown conversion, then headless-browser rendering.
https://markdown.new/crawl runs an asynchronous crawl job over a whole site (up to 500 pages per job, depth up to 10, optional JavaScript rendering) and lets you download the result as a single .md file. Use it instead of looping over single-page requests; see the site for the current job request format, which is not covered here.
The service returns useful metadata in response headers:
x-markdown-tokens — estimated token count of the outputx-rate-limit-remaining — requests remaining in current window"""fetch_article.py — Extract a single article as Markdown."""
import requests
def fetch_markdown(url: str, method: str = "auto") -> str:
"""Convert a URL to clean Markdown.
Args:
url: Public HTTP/HTTPS URL to convert.
method: Conversion method — "auto", "ai", or "browser".
Returns:
Markdown string of the page content.
"""
resp = requests.post(
"https://markdown.new/",
json={"url": url, "method": method, "retain_images": False},
timeout=30,
)
resp.raise_for_status()
return resp.text
# Extract an article
content = fetch_markdown("https://blog.cloudflare.com/markdown-for-agents/")
print(f"Extracted {len(content)} chars")
"""batch_extract.py — Extract multiple URLs with rate limiting."""
import time
import requests
def batch_extract(urls: list[str], delay: float = 0.5) -> dict[str, str]:
"""Extract Markdown from multiple URLs with rate limiting.
Args:
urls: List of public URLs to convert.
delay: Seconds to wait between requests to respect rate limits.
Returns:
Dict mapping URL to extracted Markdown content.
"""
results = {}
for url in urls:
try:
resp = requests.post(
"https://markdown.new/",
json={"url": url, "method": "auto"},
timeout=30,
)
if resp.status_code == 429: # Rate limited
print(f"Rate limited, waiting 60s...")
time.sleep(60)
resp = requests.post(
"https://markdown.new/",
json={"url": url, "method": "auto"},
timeout=30,
)
resp.raise_for_status()
results[url] = resp.text
except Exception as e:
print(f"Failed {url}: {e}")
results[url] = ""
time.sleep(delay) # Respect rate limits
return results
# Quick article extraction — pipe to file or another tool
curl -s 'https://markdown.new/https://www.bbc.com/news/technology' > article.md
# Extract and count tokens (rough estimate: words / 0.75)
curl -s 'https://markdown.new/https://www.bbc.com/news/technology' | wc -w
// fetch-markdown.js — URL to Markdown in Node.js
async function fetchMarkdown(url, method = 'auto') {
const resp = await fetch('https://markdown.new/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url, method, retain_images: false }),
});
if (resp.status === 429) {
throw new Error('Rate limited — wait and retry');
}
if (!resp.ok) {
throw new Error(`Conversion failed: ${resp.status}`);
}
return resp.text();
}
User request: "Read https://react.dev/learn and give me the key points."
curl -s -D headers.txt 'https://markdown.new/https://react.dev/learn' > learn.md
grep -i x-markdown-tokens headers.txt
The file learn.md holds the page as Markdown with frontmatter, and the header shows an estimated token count (for example x-markdown-tokens: 4210) so you know it fits the context before reading it.
User request: "The dashboard page came back empty."
curl -s -X POST https://markdown.new/ -H 'Content-Type: application/json' \
-d '{"url": "https://status.github.com", "method": "browser"}' > status.md
The headless-browser method renders the page first, so content built by JavaScript appears in status.md.
x-rate-limit-remaining header.auto first, fall back to browser for JS-heavy pages.retain_images when you only need text — reduces output size.