名称: web-fetch 描述: 通过优先获取原生markdown格式响应,并在失败时回退到基于选择器的HTML提取,获取网页内容并转换为干净的markdown格式。适用于http/https网址的文档、文章和参考页面。
网页内容获取
按以下顺序获取网页内容:
- 优先使用原生markdown端点(
content-type: text/markdown) - 对已知网站使用基于选择器的HTML提取
- 当选择器失败时使用捆绑的Bun回退脚本
前提条件
提取前验证所需工具:
command -v curl >/dev/null || echo "需要安装curl"
command -v html2markdown >/dev/null || echo "HTML提取需要html2markdown"
command -v bun >/dev/null || echo "fetch.ts回退需要bun"
安装捆绑脚本的Bun依赖:
cd ~/.claude/skills/web-fetch && bun install
默认工作流程
对任何URL使用此默认流程:
URL="<url>"
CONTENT_TYPE="$(curl -sIL "$URL" | awk -F': ' 'tolower($1)=="content-type"{print tolower($2)}' | tr -d '\r' | tail -1)"
if echo "$CONTENT_TYPE" | grep -q "markdown"; then
curl -sL "$URL"
else
curl -sL "$URL" \
| html2markdown \
--include-selector "article,main,[role=main]" \
--exclude-selector "nav,header,footer,script,style"
fi
已知网站选择器
| 网站 | 包含选择器 | 排除选择器 |
|---|---|---|
| platform.claude.com | #content-container |
- |
| docs.anthropic.com | #content-container |
- |
| developer.mozilla.org | article |
- |
| github.com (文档) | article |
nav,.sidebar |
| 通用 | article,main,[role=main] |
nav,header,footer,script,style |
示例:
curl -sL "<url>" \
| html2markdown \
--include-selector "#content-container" \
--exclude-selector "nav,header,footer"
查找正确的选择器
当网站不在模式列表中时:
# 检查存在哪些内容容器
curl -s "<url>" | grep -o '<article[^>]*>\|<main[^>]*>\|id="[^"]*content[^"]*"' | head -10
# 测试选择器
curl -sL "<url>" | html2markdown --include-selector "<selector>" | head -30
# 检查行数
curl -sL "<url>" | html2markdown --include-selector "<selector>" | wc -l
通用回退脚本
当选择器产生不良输出时,运行捆绑的解析器:
bun ~/.claude/skills/web-fetch/fetch.ts "<url>"
如果已在技能目录中:
bun fetch.ts "<url>"
选项参考
--include-selector "CSS" # 仅保留匹配元素
--exclude-selector "CSS" # 移除匹配元素
--domain "https://..." # 将相对链接转换为绝对链接
故障排除
选择器输出为空:页面可能是原生markdown。首先检查头部:
curl -sIL "<url>" | grep -i '^content-type:'
选择了错误的内容:网站可能有多个article/main区域:
curl -s "<url>" | grep -o '<article[^>]*>'
找不到html2markdown:安装后重试选择器提取。
缺少bun或脚本依赖:运行cd ~/.claude/skills/web-fetch && bun install。
缺少代码块:检查网站是否使用非标准代码格式。
客户端渲染内容:如果HTML只有"Loading…"占位符,内容是JS渲染的。curl和Bun脚本都无法提取;请使用基于浏览器的工具。