HHY 扩展 · v1.1 已实现
HTML 扩展与抓取框架
用官方 HTML 扩展和 my-crawler 完成一次真实、可审计、有边界的静态页面采集。
为什么先做静态文档采集
HHY 已经拥有 HTTP、timeout、retry、parallel、结构化错误和原子文件输出。缺失的一环是 DOM 解析,所以第一版不把 Runtime 变成浏览器,而是增加一个无网络、无文件权限的 html 进程扩展:HHY 负责抓取与调度,Lexbor 负责解析不可信 HTML 和执行 CSS Selector。
构建与安装 HTML 扩展
brew install jansson lexbor
make -C extensions/html
./build/hhy install ./extensions/html
./build/hhy list| Callable | 结果 | 用途 |
|---|---|---|
| html.text / text_all | String / List | 读取一个或多个节点的规范化文本 |
| html.attr / attr_all | String / List | 读取一个或多个属性 |
| html.exists | Bool | 判断 Selector 是否命中 |
| html.extract | List<Map> | 一次解析文档,并按 schema 投影重复记录 |
扩展把输入限制在 768 KiB,集合默认最多返回 1000 项、硬上限 10000 项,以便协议消息始终有界。它不返回 DOM handle:Protocol 1 只运输 JSON 可表达的值,因此 html.extract 在扩展内一次完成解析和字段投影。
初始化 my-crawler
make
./practical-projects/my-crawler/init.sh
./practical-projects/my-crawler/self-test.sh
./practical-projects/my-crawler/run.shinit.sh 把 html 扩展安装在项目自己的 .hhy-extensions 中,不污染用户级扩展目录,并创建被 Git 忽略的 output。self-test.sh 使用本机 fixture server 验证完整 HTTP → DOM → JSON 链路;run.sh 默认执行真实的 hhylang.dev 文档抓取。
{
"seeds": ["https://hhylang.dev/zh/learn/cli-reference"],
"parallelism": 2,
"root_selector": "main article h2",
"max_results": 100,
"schema": {
"title": { "selector": "", "value": "text" },
"anchor": { "selector": "", "value": "attr", "name": "id" }
}
}真实运行结果与边界
$./practical-projects/my-crawler/run.sh
HHY Collector Framework HHY Documentation Crawler Pages 1 / 1 Records 6 Failures 0 Records practical-projects/my-crawler/output/records.json Report practical-projects/my-crawler/output/report.json
| 层 | 职责 |
|---|---|
| Crawler | 种子去重、有界并发、timeout/retry、逐页失败归档 |
| HTML extension | Lexbor DOM、CSS Selector、文本/属性/schema 抽取 |
| Output | records、report、failures 三份原子 JSON |
| 当前边界 | 响应体完整缓冲;不支持 JS 渲染、浏览器自动化和无限流 |
