# htmlsense **Repository Path**: cg33/htmlsense ## Basic Information - **Project Name**: htmlsense - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-19 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # htmlsense htmlsense 是一个 Go 语言库和命令行工具,用于自动从 HTML 文档中提取元素的 XPath 选择器映射。它利用大语言模型(LLM)的智能分析能力,自动识别 HTML 中的重复结构和有价值的内容元素,并生成对应的 XPath 选择器,大大简化了网页爬虫开发中手动编写选择器的工作。 ## 项目背景 在开发网页爬虫程序时,我们经常需要手动识别和编写 XPath 或 CSS 选择器来定位页面元素。这个过程既繁琐又容易出错,特别是当页面结构复杂或经常变化时。htmlsense 通过结合 HTML 结构分析和 LLM 的智能识别能力,实现了选择器的自动生成,让爬虫开发更加高效。 ## 功能特性 - ✨ **智能识别**:使用 LLM 自动识别 HTML 中的重复结构和有价值的内容元素 - 🧹 **自动清理**:自动移除 head、style、script 等干扰标签和属性 - 🎯 **范围提取**:支持通过 scopeXPath 指定提取范围,聚焦特定区域 - ✅ **自动校验**:自动校验生成的 XPath 选择器有效性,过滤无效选择器 - 📊 **数据提取**:可选择提取实际数据(表格格式),而不仅仅是选择器 - 🛠️ **命令行工具**:提供完整的命令行工具,方便集成到脚本和自动化流程中 - 📦 **易于集成**:可作为 Go 库使用,轻松集成到现有项目中 - 🔧 **灵活配置**:支持多种 LLM 提供商和模型配置 ## 安装 ### 前置要求 - Go 1.21 或更高版本 - LLM API 密钥(OpenAI 或其他支持的提供商) ### 从源码安装 ```bash git clone https://github.com/gotoailab/htmlsense.git cd htmlsense make install ``` 安装后,`htmlsense` 命令将被安装到 `$GOPATH/bin` 目录。 ### 使用 Makefile 构建 ```bash # 构建二进制文件到 build/ 目录 make build # 安装到 GOPATH/bin make install # 运行所有测试 make test # 生成测试覆盖率报告 make test-coverage # 格式化代码 make fmt # 运行代码检查 make vet # 运行所有检查(格式化、检查、测试) make check # 构建多平台发布版本 make release # 查看所有可用命令 make help ``` ## 快速开始 ### 命令行工具使用 #### 基本用法 ```bash # 从文件提取选择器 htmlsense -html page.html -api-key YOUR_API_KEY # 从标准输入提取 cat page.html | htmlsense -html - -api-key YOUR_API_KEY # 指定范围提取(例如只在某个容器内) htmlsense -html page.html -scope "//div[@class='container']" -api-key YOUR_API_KEY # 输出为文本格式(默认是 JSON) htmlsense -html page.html -output text -api-key YOUR_API_KEY # 提取实际数据(表格格式) htmlsense -html page.html -extract-data -api-key YOUR_API_KEY # 提取数据并指定范围 htmlsense -html page.html -extract-data -scope "//div[@class='container']" -api-key YOUR_API_KEY # 保存中间结果到目录 htmlsense -html page.html -save-intermediate ./output -api-key YOUR_API_KEY # 提取数据并保存中间结果 htmlsense -html page.html -extract-data -save-intermediate ./output -api-key YOUR_API_KEY # 使用环境变量设置 API key(推荐) export HTMLSENSE_API_KEY=YOUR_API_KEY htmlsense -html page.html # 指定不同的 LLM 提供商和模型 htmlsense -html page.html -provider openai -model gpt-4 -api-key YOUR_API_KEY ``` #### 命令行参数说明 | 参数 | 说明 | 默认值 | 必需 | |------|------|--------|------| | `-html` | HTML 文件路径(使用 `-` 表示从标准输入读取) | - | 是 | | `-output` | 输出格式:`json` 或 `text` | `json` | 否 | | `-scope` | 可选的 XPath,用于限制提取范围 | - | 否 | | `-extract-data` | 提取实际数据而不仅仅是选择器 | `false` | 否 | | `-save-intermediate` | 保存中间结果的目录(simplified.html, selectors.json, data.json) | - | 否 | | `-api-key` | LLM API 密钥 | - | 是* | | `-provider` | LLM 提供商(如 `openai`) | `openai` | 否 | | `-model` | LLM 模型名称 | `gpt-4` | 否 | | `-version` | 显示版本信息 | - | 否 | | `-help` | 显示帮助信息 | - | 否 | *可以通过 `HTMLSENSE_API_KEY` 环境变量设置,此时不需要 `-api-key` 参数 #### 输出示例 **JSON 格式输出:** ```json { "title": "//h1[@class='article-title']", "content": "//div[@class='article-content']//p", "author": "//span[@class='author-name']", "date": "//time[@class='publish-date']" } ``` **文本格式输出:** ``` Extracted selector mappings: title: //h1[@class='article-title'] content: //div[@class='article-content']//p author: //span[@class='author-name'] date: //time[@class='publish-date'] ``` **数据提取输出(使用 `-extract-data` 参数):** JSON 格式: ```json [ { "title": "文章标题 1", "content": "文章内容 1...", "author": "作者名 1", "date": "2024-01-01" }, { "title": "文章标题 2", "content": "文章内容 2...", "author": "作者名 2", "date": "2024-01-02" } ] ``` 文本格式: ``` Extracted data: Row 1: title: 文章标题 1 content: 文章内容 1... author: 作者名 1 date: 2024-01-01 Row 2: title: 文章标题 2 content: 文章内容 2... author: 作者名 2 date: 2024-01-02 ``` **中间结果(使用 `-save-intermediate` 参数):** 使用 `-save-intermediate` 时,会在指定目录保存以下文件: - `simplified.html`:清理和简化后的 HTML,用于 LLM 分析 - `selectors.json`:包含 LLM 返回的原始选择器和验证后的选择器: ```json { "raw_selectors": { "title": "//h1[@class='article-title']", "content": "//div[@class='article-content']//p" }, "valid_selectors": { "title": "//h1[@class='article-title']", "content": "//div[@class='article-content']//p" } } ``` - `data.json`:提取的数据,JSON 格式(仅在使用了 `-extract-data` 时生成) ### 作为 Go 库使用 ```go package main import ( "context" "fmt" "log" "github.com/gotoailab/htmlsense" ) func main() { // 配置 htmlsense config := htmlsense.Config{ APIKey: "your-api-key", Provider: "openai", Model: "gpt-4", } // 创建提取器 extractor, err := htmlsense.NewExtractor(config) if err != nil { log.Fatal(err) } // HTML 内容 htmlContent := `
文章内容...