快速回答
如何将网页转为 Markdown 供 LLM 使用?
抓取页面,只保留正文,然后把标题、列表、表格和链接转换为 Markdown,并将长度控制在你模型的预算之内。你可以手动完成、使用开源库完成,或通过一次 API 调用完成:WebReaderAPI 返回 Markdown 和元数据,每页一个积分,自 2026 年 10 月起为 US$0.07/千页。无需 KYC;加密货币支付。
从网页获取 Markdown 的三种方式
| 手动 | 从浏览器或其阅读器视图复制文本;适用于少量页面 |
|---|---|
| 开源库 | 在你自己的抓取器中使用 Readability、Trafilatura、MarkItDown 或 Crawl4AI |
| 网页读取 API | GET https://webreaderapi.com/api/v1/read?url=… 返回 Markdown、标题、作者和日期 |
| 长度控制 | 在 WebReaderAPI 上使用 max_chars,或在转换后自行截断文本 |
| JavaScript 页面 | 需要无头浏览器;需要时 WebReaderAPI 会渲染它们,消耗 2 积分 |
我应该用哪种方法?
按规模以及你想自行运行多少基础设施来选择。
| 方法 | 适合 | 你需要负责 |
|---|---|---|
| 复制粘贴 | 少量页面、一次性提示 | 手动清理 |
| 代码中的库 | 稳定规模、完全掌控 | 抓取、浏览器、robots.txt、PDF、重试 |
| 网页读取 API | 读取大量站点的 agent 和流水线 | 只需发出请求和接收结果 |
库能给你掌控力,且不按页收费。代价在运维:JavaScript 页面需要无头浏览器,还要处理 robots.txt 检查、字符集和重定向,并为 PDF 单独开一条路径。API 则把这一切并入一次 HTTP 调用。
好的 Markdown 应保留什么,又该丢弃什么?
好的 Markdown 会保留每一个承载含义的元素,丢弃一切只为排版或营销而存在的内容。
- 保留标题为
#、##和###:它们告诉模型(以及你的分块器)每个主题从哪里开始。 - 保留列表和表格为 Markdown 列表和竖线表格,让步骤和数字保持可读。
- 保留链接为
[text](url):它们让助手能引用并追踪来源。 - 保留代码块并加围栏,页面显示语言时一并标出。
- 丢弃菜单、Cookie 提示、广告、相关文章组件和页脚:它们在每个页面重复出现,会污染检索。
在你自己的几个真实页面上检查结果。提取工具在论坛、长表格和包含多篇文章的页面上分歧最大。
Markdown 比 HTML 小多少?
通常小得多,因为页面附属元素和标记都消失了。当 Cloudflare 于 2026 年 2 月 12 日推出面向 agent 的 Markdown 功能时,其示例页面从 HTML 的 16,180 token 降至 Markdown 的 3,150 token,约减少 80%。
你自己的比例取决于站点。长文章按百分比算比被沉重模板包裹的短页面缩减得少。在确定预算之前,先在你的来源上测量。
如何让页面控制在我的模型 token 预算之内?
在文本到达模型之前先设上限,然后沿标题拆分剩余部分。使用 WebReaderAPI 时,max_chars 参数会按设定长度(1,000 到 500,000 个字符之间)截断 Markdown。word_count 字段会告诉你完整文章有多长,agent 据此可判断读完剩余部分是否值得。
用于检索时,先按标题拆分,然后再截断过长的小节。以自身标题开头的小块会保留其主题;从长页面中间某句话截断的小块则不会。
import os
import re
import requests
API = "https://webreaderapi.com/api/v1/read"
HEADERS = {"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]}
def page_to_chunks(url, max_chars=60000, chunk_len=1500):
params = {"url": url, "format": "markdown", "max_chars": max_chars}
resp = requests.get(API, headers=HEADERS, params=params, timeout=90)
data = resp.json()
if resp.status_code != 200:
print("not read:", data["error"]["code"])
return []
chunks = []
for section in re.split(r"\n(?=#{1,3} )", data["markdown"]):
section = section.strip()
while section:
chunks.append(section[:chunk_len])
section = section[chunk_len:]
return [{"text": c, "source": data["final_url"], "title": data["title"]} for c in chunks]
if __name__ == "__main__":
for chunk in page_to_chunks("https://example.com/guides/compost")[:3]:
print(chunk["title"], "|", chunk["text"][:80])
常见问题有哪些,我该如何发现?
四类问题导致了大多数糟糕的转换:
- 输出为空。 页面用 JavaScript 构建内容。查看较低的
word_count;在浏览器中渲染页面,或设置render=true。 - 结果中出现 Cookie 或同意文本。 提取器保留了横幅。优先使用正文提取,并检查每条结果的前几行。
- 表格缺失。 有些站点把表格画成图片或 canvas 元素;任何文本提取器都读不了这些。
- 返回拒绝而不是页面。 站点在 robots.txt 中禁止了 robots 或拒绝了请求。请尊重它:向所有者申请访问权限,或在站点提供官方 API 或 feed 时使用它。
这些问题都不会靠更快重试解决。读懂错误,然后更换方法或来源。
网页转 Markdown:常见问题
对 LLM 来说,Markdown 比纯文本更好吗?
对大多数页面来说,是的。Markdown 以极小的 token 开销保留标题、列表、表格和链接,因此模型能看到结构并引用来源。纯文本略短,但会丢失这些结构。
我能转换整个网站,而不只是一个页面吗?
可以。抓取它并转换每个页面。WebReaderAPI 的 crawl API 在一个任务中同时完成两者:每个任务抓取一个网站,最多 10,000 页,遵循其 sitemap、robots.txt 和 Crawl-delay。
我能用同样的方式转换 PDF 吗?
可以,只需把 PDF 的 URL 发送到同一个 endpoint。最大 20 MB、100 页的 PDF 文件可转换为 Markdown,每 10 页(不足 10 页按 10 页计)1 积分。
登录之后的页面怎么办?
不要通过第三方服务转换它们,除非它们是你自己的、且由你自行导出。WebReaderAPI 只读取公开页面,从不登录账户。
有免费的办法吗?
开源库可免费使用并在你自己的机器上运行。WebReaderAPI 没有免费套餐;其最小套餐为 10,000 个网页,价格 US$3.75,用加密货币支付,无需 KYC。
来源 (1)
- 推出面向 agent 的 Markdown — Cloudflare (2026-02-12)