skills/spa-doc-extractor/SKILL.md
自动化提取单页应用(SPA)技术文档内容的工具。使用agent-browser进行浏览器自动化,支持动态内容加载、多页面爬取、结构化数据提取和截图保存。适用于需要从Vue/React/Angular等框架构建的文档网站(如官方文档、API文档、技术教程)提取内容的场景。
npx skillsauth add caobingsheng/skills spa-doc-extractorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
使用 agent-browser 自动化从 SPA(单页应用)网站提取技术文档内容,支持处理动态加载内容、导航多个页面、提取结构化数据和保存截图。
# 1. 打开文档网站并等待加载
agent-browser open https://example.com/docs
agent-browser wait --load networkidle
# 2. 获取页面结构
agent-browser snapshot -i
# 3. 提取内容
agent-browser get text @main-content > output.md
# 4. 截图(可选)
agent-browser screenshot --full output.png
适用于提取单个文档页面的内容。
# 打开页面
agent-browser open https://example.com/docs/introduction
agent-browser wait --load networkidle
# 获取元素引用
agent-browser snapshot -i
# 提取文本内容
agent-browser get text @main-content > docs/introduction.md
# 保存截图
agent-browser screenshot --full docs/introduction.png
适用于爬取整个文档网站。
使用脚本:scripts/batch-extract.sh
./scripts/batch-extract.sh https://example.com/docs ./output
使用 JavaScript 提取文档结构。
agent-browser open https://example.com/docs
agent-browser wait --load networkidle
# 提取所有章节标题和链接
agent-browser eval "
Array.from(document.querySelectorAll('nav a')).map(a => ({
title: a.textContent.trim(),
href: a.href
}))
" > structure.json
最简单的方式,直接提取并保存为Markdown:
# 打开页面并等待加载
npx agent-browser open https://element.eleme.cn/#/zh-CN/component/quickstart
npx agent-browser wait --load networkidle
# 直接提取文本内容
npx agent-browser get text .page-component__content > element-quickstart.md
关键点:
npx agent-browser 确保使用最新版本wait --load networkidle 等待所有网络请求完成.md 文件# 使用批量提取脚本
./scripts/batch-extract.sh \
--url https://example.com/docs \
--output ./extracted-docs \
--selector ".sidebar a" \
--content-selector "main"
agent-browser open https://example.com/docs
agent-browser wait --load networkidle
agent-browser snapshot -i
# 点击侧边栏导航到特定章节
agent-browser find text "快速开始" click
agent-browser wait --load networkidle
# 提取内容
agent-browser get text @main-content > quick-start.md
# 登录并保存状态
agent-browser open https://app.example.com/login
agent-browser snapshot -i
agent-browser fill @email "[email protected]"
agent-browser fill @password "password"
agent-browser click @submit
agent-browser wait --url "**/dashboard"
agent-browser state save auth.json
# 后续使用保存的状态
agent-browser state load auth.json
agent-browser open https://app.example.com/docs
agent-browser wait --load networkidle
agent-browser get text @main-content > docs.md
完整示例:提取 Element UI 快速开始文档
# 1. 打开页面
npx agent-browser open https://element.eleme.cn/#/zh-CN/component/quickstart
# 2. 等待页面完全加载(重要!)
npx agent-browser wait --load networkidle
# 3. 提取内容(Element UI 使用 .page-component__content 作为主容器)
npx agent-browser get text .page-component__content > element-quickstart-raw.md
# 4. 手动格式化(如果需要)
# 将纯文本转换为结构化的 Markdown,添加标题层级、代码块等
SPA 必须等待内容完全加载:
# 等待网络空闲(推荐)
agent-browser wait --load networkidle
# 等待特定文本出现
agent-browser wait --text "文档已加载"
# 等待特定元素出现
agent-browser wait @content-area
# 等待 URL 匹配模式
agent-browser wait --url "**/docs/*"
页面变化后必须重新快照:
# 页面1
agent-browser open page1.html
agent-browser snapshot -i
agent-browser click @next-page
# 必须重新快照获取新引用
agent-browser wait --load networkidle
agent-browser snapshot -i
agent-browser get text @main-content # 使用新的引用
while true; do
# 提取当前页
agent-browser get text @content > "page$page.md"
# 检查是否有下一页
if ! agent-browser is visible @next-button; then
break
fi
# 点击下一页
agent-browser click @next-button
agent-browser wait --load networkidle
agent-browser snapshot -i
page=$((page + 1))
done
agent-browser --headed open https://example.com/docs
agent-browser errors
agent-browser is visible @element
agent-browser is enabled @element
agent-browser highlight @element
参见 scripts/ 目录中的示例脚本:
batch-extract.sh - 批量提取多个页面single-page-extract.sh - 单页面提取模板structured-extract.sh - 结构化数据提取常见的内容选择器:
| 网站类型 | 主内容选择器 | 侧边栏选择器 | 示例网站 |
|---------|------------|------------|----------|
| VuePress | .theme-default-content | .sidebar | Vue.js 官方文档 |
| VitePress | .VPDoc | .VPDocAside | Vite 官方文档 |
| Docusaurus | article | .sidebar | React 官方文档 |
| GitBook | .page-content | .summary | 各种 GitBook 文档 |
| Element UI | .page-component__content | .nav-component | element.eleme.cn |
| Ant Design | .markdown | .aside-container | ant.design |
| Vue Router | .content | .sidebar | router.vuejs.org |
| Vuex | .content | .sidebar | vuex.vuejs.org |
| 通用 | main, article, #content | .nav, .sidebar, [role="navigation"] | - |
中文技术文档常见选择器:
# Element UI / Element Plus
.page-component__content
# Ant Design / Ant Design Vue
.markdown, .markdown-api
# Vue 生态系统
.content, .theme-default-content
# 通用中文文档
main, article, .doc-content, .page-content
如何找到正确的选择器:
# 1. 打开页面并快照
npx agent-browser open https://example.com/docs
npx agent-browser wait --load networkidle
npx agent-browser snapshot -i
# 2. 在浏览器开发者工具中检查元素
# 右键点击主内容区域 -> 检查 -> 查看容器的 class 或 id
# 3. 测试选择器是否正确
npx agent-browser eval "document.querySelector('.your-selector').textContent"
# 使用状态保存加速重复访问
agent-browser state save session.json
# 添加延迟避免被限速
agent-browser wait 1000
# 使用 JSON 输出解析结果
agent-browser get text @content --json | jq -r '.content' > output.txt
直接提取的文本通常是纯文本,需要手动或自动格式化:
方法1:手动格式化(推荐用于重要文档)
# 提取原始文本
npx agent-browser get text .page-component__content > raw.md
# 使用编辑器手动格式化:
# 1. 添加标题层级(#, ##, ###)
# 2. 将代码块包裹在 ``` 中
# 3. 调整列表格式
# 4. 添加适当的空行
方法2:使用脚本自动格式化
创建格式化脚本 format-doc.js:
// 简单的 Markdown 格式化脚本
const fs = require('fs');
const content = fs.readFileSync('raw.md', 'utf8');
// 1. 识别标题(全大写或特殊格式的行)
let formatted = content.replace(/^([A-Z\s]{10,})$/gm, '\n## $1\n');
// 2. 识别代码块(缩进或特殊标记)
formatted = formatted.replace(/ (.+)/g, ' $1');
// 3. 修复列表格式
formatted = formatted.replace(/^(\d+)\.\s+/gm, '$1. ');
fs.writeFileSync('formatted.md', formatted);
方法3:使用 AI 辅助格式化
# 提取后让 AI 帮助格式化
npx agent-browser get text .page-component__content > raw.md
# 使用 AI 工具(如 ChatGPT, Claude)进行格式化
# 提示词:请将以下文本格式化为标准的 Markdown 文档,包括标题层级、代码块、列表等
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 标题丢失 | 选择器未包含标题层级 | 使用更精确的选择器或手动添加 |
| 代码块未格式化 | 纯文本提取丢失格式 | 手动添加 ``` 包裹 |
| 列表混乱 | 嵌套列表缩进问题 | 调整缩进或使用 Markdown 列表语法 |
| 空行过多 | 多个连续空行 | 使用正则替换:\n{3,} → \n\n |
| 特殊字符丢失 | HTML 实体未解码 | 手动替换或使用解码工具 |
# 完整工作流
npx agent-browser open https://example.com/docs
npx agent-browser wait --load networkidle
npx agent-browser get text .content > docs-raw.md
# 使用 sed/awk 进行简单格式化
# 1. 删除多余空行
sed -i '' '/^$/N;/^\n$/D' docs-raw.md
# 2. 添加标题标记
sed -i '' 's/^第一章/# 第一章/' docs-raw.md
# 3. 识别代码块(假设代码以 4 个空格开头)
sed -i '' 's/^ /```javascript\n&/' docs-raw.md
目标:提取 https://element.eleme.cn/#/zh-CN/component/quickstart
步骤:
# 1. 打开页面
npx agent-browser open https://element.eleme.cn/#/zh-CN/component/quickstart
# 2. 等待页面完全加载
npx agent-browser wait --load networkidle
# 3. 提取内容
npx agent-browser get text .page-component__content > element-quickstart-raw.md
# 4. 手动格式化(添加标题层级、代码块等)
# 最终输出:element-ui-quickstart.md
关键发现:
.page-component__content 作为主内容容器wait --load networkidle 等待所有内容加载输出示例:
# Element UI 快速上手
本节将介绍如何在项目中使用 Element。
## 使用 vue-cli@3
我们为新版的 vue-cli 准备了相应的 Element 插件...
## 引入 Element
### 完整引入
在 main.js 中写入以下内容:
```javascript
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
### 案例2:Vue Router 官方文档
```bash
# 打开 Vue Router 指南
npx agent-browser open https://router.vuejs.org/zh/guide/
npx agent-browser wait --load networkidle
# VuePress 使用 .theme-default-content
npx agent-browser get text .theme-default-content > vue-router-guide.md
# 打开 Ant Design Vue 快速开始
npx agent-browser open https://antdv.com/docs/vue/getting-started-cn/
npx agent-browser wait --load networkidle
# Ant Design 使用 .markdown
npx agent-browser get text .markdown > ant-design-vue-quickstart.md
#!/bin/bash
# 批量提取 Element UI 组件文档
components=("button" "input" "select" "form" "table")
for comp in "${components[@]}"; do
echo "提取 $comp 组件文档..."
npx agent-browser open "https://element.eleme.cn/#/zh-CN/component/$comp"
npx agent-browser wait --load networkidle
npx agent-browser get text .page-component__content > "docs/element-$comp.md"
sleep 2 # 避免请求过快
done
echo "提取完成!"
wait --load networkidlebatch-extract.sh - 批量提取多个文档页面single-page-extract.sh - 单页面提取脚本structured-extract.sh - 结构化数据提取脚本selectors-guide.md - 常见文档网站选择器指南advanced-patterns.md - 高级提取模式和技巧wait --load networkidle--headed 模式查看实际渲染snapshot -i 更新引用agent-browser --proxy http://proxy.com:8080export LANG=zh_CN.UTF-8file -I output.mdiconv -f GBK -t UTF-8 input.md > output.md# 基础流程
npx agent-browser open <URL> # 打开页面
npx agent-browser wait --load networkidle # 等待加载
npx agent-browser get text <selector> > file.md # 提取内容
# 调试命令
npx agent-browser --headed open <URL> # 显示浏览器窗口
npx agent-browser snapshot -i # 获取元素引用
npx agent-browser screenshot --full file.png # 截图
# 状态管理
npx agent-browser state save session.json # 保存状态
npx agent-browser state load session.json # 加载状态
# Vue 生态系统
VuePress: .theme-default-content
VitePress: .VPDoc
Vue Router: .content
Vuex: .content
# UI 组件库
Element UI: .page-component__content
Ant Design: .markdown
Ant Design Vue: .markdown
Element Plus: .content
# 通用选择器
main, article, .content, .doc-content, .page-content
#!/bin/bash
# SPA 文档提取模板
URL="https://example.com/docs"
SELECTOR=".content"
OUTPUT="output.md"
# 1. 打开页面
npx agent-browser open "$URL"
# 2. 等待加载
npx agent-browser wait --load networkidle
# 3. 提取内容
npx agent-browser get text "$SELECTOR" > "$OUTPUT"
# 4. 清理和格式化
# 删除多余空行
sed -i '' '/^$/N;/^\n$/D' "$OUTPUT"
echo "文档已提取到: $OUTPUT"
npx agent-browser - 确保使用最新版本wait --load networkidle 是关键development
Use when working with tdd workflows tdd refactor
testing
Generate failing tests for the TDD red phase to define expected behavior and edge cases.
development
Implement the minimal code needed to make failing tests pass in the TDD green phase.
tools
Use when working with tdd workflows tdd cycle