Skip to content

配置实战

Config 结构体有 30+ 个字段,但日常使用只需理解几组关键配置。本指南帮助你快速选择适合场景的配置方案,完整字段说明详见 API 参考 — 配置

四种预设配置

库提供四种预设,覆盖大多数场景:

预设适用场景关键差异
DefaultConfig()通用提取全功能开启,安全默认值
HighSecurityConfig()不受信任输入缩小限制、启用审计、降低深度上限
TextOnlyConfig()仅需纯文本关闭所有媒体保留,最大性能
MarkdownConfig()输出 Markdown内联图片/链接转 Markdown 格式
go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    data := []byte(`<html><body><h1>标题</h1><p>正文内容</p></body></html>`)

    // 大多数场景:直接用默认配置
    p1, _ := html.New()
    defer p1.Close()
    r1, _ := p1.Extract(data)
    fmt.Println(r1.Title)

    // 只需要纯文本(如搜索引擎索引)
    p2, _ := html.New(html.TextOnlyConfig())
    defer p2.Close()

    // 输出 Markdown(如 CMS 迁移)
    p3, _ := html.New(html.MarkdownConfig())
    defer p3.Close()
    md, _ := p3.ExtractToMarkdown(data)
    fmt.Println(md)
}

从预设开始

不确定时,从 DefaultConfig() 开始,按需调整个别字段。预设之间可以组合——先取一个预设,再覆盖字段:

go
cfg := html.HighSecurityConfig()
cfg.PreserveImages = false // 在高安全基础上额外关闭图片
processor, _ := html.New(cfg)

六大类字段导览

资源管理

控制内存使用和性能。日常开发通常不需要调整。

字段默认值说明
MaxInputSize50 MB最大输入大小,防止内存耗尽
MaxCacheEntries2000缓存条目数上限;设 0 禁用缓存
CacheTTL1 小时缓存存活时间
CacheCleanup5 分钟后台清理过期缓存间隔
WorkerPoolSize4批量处理并发数(1–256)
ProcessingTimeout30 秒单文档处理超时;设 0 不限时

缓存仅对 Processor 实例生效

包级函数(如 html.Extract)使用池化 Processor,每次调用后清空缓存。需要缓存请用 html.New() 创建独立 Processor。详见 Processor 复用与缓存

安全

安全配置是生产环境必须关注的重点。完整安全特性介绍详见 安全概述

字段默认值说明
EnableSanitizationtrueHTML 消毒(移除危险标签/属性)
MaxDepth500DOM 嵌套深度上限,防止栈溢出
AllowedBaseDir""文件操作沙箱目录;空 = 不限制
Audit禁用安全审计日志配置

AllowedBaseDir

处理用户提供文件路径时,务必设置 AllowedBaseDir。它通过 OS 文件句柄解析真实路径(防符号链接和 Windows junction 绕过)。

内容提取

控制从 HTML 中提取哪些内容。

字段默认值说明
ExtractArticletrue智能文章识别(自动定位主体内容)
PreserveImagestrue保留图片信息
PreserveLinkstrue保留链接信息
PreserveVideostrue提取视频
PreserveAudiostrue提取音频

关闭不需要的媒体类型可提升性能:

go
cfg := html.DefaultConfig()
cfg.PreserveVideos = false
cfg.PreserveAudios = false
// 只提取文本、图片和链接

输出格式

控制文本输出中图片和链接的呈现方式。详见 输出格式实战

字段默认值可选值
InlineImageFormat"none""none", "markdown", "html", "placeholder"
InlineLinkFormat"none""none", "markdown", "html"
TableFormat"markdown""markdown", "html"
Encoding""(自动)"utf-8", "gbk", "shift_jis", "windows-1252"

Encoding 留空时自动检测。手动指定可跳过检测步骤提升性能,但仅在确知编码时使用。详见 编码检测实战

链接提取

以下字段仅在 ExtractAllLinks 中生效,控制提取哪些类型的资源链接。详见 链接提取实战

字段默认值说明
ResolveRelativeURLstrue将相对 URL 解析为绝对 URL
BaseURL""解析基准;空时自动从 HTML 检测
IncludeImagestrue包含 <img> 链接
IncludeVideostrue包含 <video>/<iframe> 链接
IncludeAudiostrue包含 <audio> 链接
IncludeCSStrue包含 <link rel="stylesheet">
IncludeJStrue包含 <script src>
IncludeContentLinkstrue包含 <a href> 内部链接
IncludeExternalLinkstrue包含外部链接
IncludeIconstrue包含 favicon/icon

链接提取 vs 内容提取

Include* 字段仅影响 ExtractAllLinks。内容提取(Extract)中的链接保留由 PreserveLinks 控制。

扩展

字段说明
Scorer自定义内容评分器;nil 时用 DefaultScorer

自定义 Scorer 可针对特定网站优化文章识别。详见 测试与自定义扩展

常见配置组合

Web 爬虫

高频批量抓取场景,提高并发并缩短超时:

go
package main

import (
    "log"
    "time"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.DefaultConfig()
    cfg.WorkerPoolSize = 8                          // 提高批量并发
    cfg.ProcessingTimeout = 10 * time.Second        // 缩短超时
    cfg.PreserveVideos = false                      // 爬虫不需要视频
    cfg.PreserveAudios = false

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // 批量提取
    pages := [][]byte{[]byte("<html><body>页面1</body></html>")}
    batch := processor.ExtractBatch(pages)
    log.Printf("成功 %d, 失败 %d", batch.Success, batch.Failed)
}

API 后端服务

处理用户提交 HTML,使用高安全配置并限制文件目录:

go
package main

import (
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.HighSecurityConfig()
    cfg.AllowedBaseDir = "/var/www/uploads" // 限制文件目录

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // 处理用户上传的 HTML 文件
    result, err := processor.ExtractFromFile("/var/www/uploads/user.html")
    if err != nil {
        log.Fatal(err)
    }
    log.Println(result.Title)
}

内容迁移工具

将旧站 HTML 转为 Markdown,保留链接并解析相对 URL:

go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.MarkdownConfig()
    cfg.ResolveRelativeURLs = true
    cfg.BaseURL = "https://old-site.example.com"

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    data := []byte(`<html><body><article><h1>旧文章</h1><a href="/post/123">链接</a></article></body></html>`)
    md, err := processor.ExtractToMarkdown(data)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(md)
}

Validate

所有配置在传入 html.New() 时自动验证。也可手动调用 Validate() 提前检查:

go
cfg := html.DefaultConfig()
cfg.MaxInputSize = -1 // 故意设错
if err := cfg.Validate(); err != nil {
    log.Fatal(err) // html: invalid config: MaxInputSize=-1, must be positive
}

验证规则包括字段范围检查和格式字符串校验。无效配置返回 *ConfigError,可用 errors.Is(err, html.ErrInvalidConfig) 判断。完整字段约束详见 API 参考 — 配置