计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
spa-doc-extractor【效率与协作】自动化提取单页应用(SPA)技术文档内容的工具。使用agent-browser进行浏览器自动化,支持动态内容加载、多页面爬取、结构化数据提取和截图保存。适用于需要从Vue/React/Angular等框架构建的文档网站(如官方文档、API文档、技术教程)提取内容的场景。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
使用 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 "user@example.com"
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 是关键