Skip to content

基础用法 ​

本页是按场景抄代码的速查索引:每个场景只给最小可运行骨架,复制即可上手;原理讲解与进阶配置请沿各节末尾的「深入」链接阅读对应指南。

场景核心调用详解页
正文与纯文本html.Extract / html.ExtractText内容提取实战
从文件提取html.ExtractFromFile内容提取实战
Markdown / JSON 输出html.ExtractToMarkdown / html.ExtractToJSON输出格式实战
链接提取html.ExtractAllLinks + html.GroupLinksByType链接提取
媒体信息html.Extract(Videos / Audios)媒体提取
批量与超时复用html.New + ExtractBatchWithContext批量处理实战

正文与纯文本 ​

Extract 一次取回完整 Result;只要纯文本时用近亲函数 ExtractText,直接返回 string:

go
package main

import (
	"fmt"
	"log"

	"github.com/cybergodev/html"
)

func main() {
	data := []byte(`<html><head><title>Go 语言教程</title></head><body><article><h1>Go 入门指南</h1><p>Go 是一门静态类型的编译语言。</p><a href="https://go.dev">Go 官网</a></article></body></html>`)

	result, err := html.Extract(data) // 传入字节,返回完整 Result
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result.Title) // 输出:Go 语言教程
	fmt.Println(result.Text)
	// 输出:Go 入门指南\n\nGo 是一门静态类型的编译语言。\n\nGo 官网

	text, err := html.ExtractText(data) // 只要纯文本:直接返回 string
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(len(text) > 0) // 输出:true(非空)
}

深入:内容提取实战

从文件提取 ​

处理磁盘文件用 ExtractFromFile,内置路径穿越防护与文件大小限制:

go
package main

import (
	"fmt"
	"log"

	"github.com/cybergodev/html"
)

func main() {
	result, err := html.ExtractFromFile("article.html")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result.Title) // 输出:article.html 的 <title> 内容
}

深入:内容提取实战

Markdown / JSON 输出 ​

内容迁移转 Markdown,程序间传输转 JSON:

go
package main

import (
	"fmt"
	"log"

	"github.com/cybergodev/html"
)

func main() {
	data := []byte(`<article><h1>Go 入门指南</h1><p>Go 是一门编译语言。</p><img src="gopher.png" alt="Gopher" /><a href="https://go.dev">Go 官网</a></article>`)
	// 转 Markdown:图片与链接自动变为 ![]() 与 []() 语法
	md, err := html.ExtractToMarkdown(data)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(md)
	// 输出:Go 入门指南\n\nGo 是一门编译语言。\n\n![Gopher](gopher.png)\n[Go 官网](https://go.dev)
	jsonBytes, err := html.ExtractToJSON(data) // 转 JSON:保留全部元数据字段
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("JSON 字节数:", len(jsonBytes))
	// JSON 字节数随内容而定(含 text/title/images/links 等字段)
}

深入:输出格式实战

链接提取 ​

独立于正文的链接提取 API,还能按类型分组:

go
package main

import (
	"fmt"
	"log"

	"github.com/cybergodev/html"
)

func main() {
	data := []byte(`<html><body><article><h1>链接示例</h1><p><a href="https://go.dev">Go 官网</a></p></article></body></html>`)

	links, err := html.ExtractAllLinks(data) // 覆盖 a/img/video/css/js 等资源
	if err != nil {
		log.Fatal(err)
	}
	for _, link := range links {
		fmt.Printf("[%s] %s - %s\n", link.Type, link.Title, link.URL)
	}
	// 输出:[link] Go 官网 - https://go.dev
	groups := html.GroupLinksByType(links) // 按类型分组
	fmt.Println("link 组:", len(groups["link"]))
	// 输出:link 组:1
}

深入:链接提取

媒体信息 ​

视频与音频信息随 Extract 一并返回,无需单独调用:

go
package main

import (
	"fmt"
	"log"

	"github.com/cybergodev/html"
)

func main() {
	data := []byte(`<html><body><article><h1>多媒体页面</h1>
<video poster="cover.jpg"><source src="https://example.com/video.mp4" type="video/mp4"></video>
<audio><source src="https://example.com/audio.mp3" type="audio/mpeg"></audio>
</article></body></html>`)
	result, err := html.Extract(data)
	if err != nil {
		log.Fatal(err)
	}
	for _, v := range result.Videos {
		fmt.Printf("视频:%s(%s)\n", v.URL, v.Type)
	}
	for _, a := range result.Audios {
		fmt.Printf("音频:%s(%s)\n", a.URL, a.Type)
	}
	// 输出:
	// 视频:https://example.com/video.mp4(video/mp4)
	// 音频:https://example.com/audio.mp3(audio/mpeg)
}

深入:媒体提取

批量、超时与 Processor 复用 ​

服务端典型姿势:创建可全局复用的 Processor,批量并发提取,并用 context 控制单批时间:

go
package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/cybergodev/html"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	p, err := html.New(html.DefaultConfig()) // 并发安全,可全局复用
	if err != nil {
		log.Fatal(err)
	}
	defer p.Close()
	pages := [][]byte{
		[]byte(`<html><body><article><h1>页面一</h1></article></body></html>`),
		[]byte(`<html><body><article><h1>页面二</h1></article></body></html>`),
	}
	batch := p.ExtractBatchWithContext(ctx, pages) // context 到期的未完成项计入 Cancelled
	fmt.Printf("成功:%d,失败:%d\n", batch.Success, batch.Failed)
	// 输出:成功:2,失败:0
}

深入:批量处理实战 与 Processor 复用与缓存