// Package parser extracts title, description, text content, and links from HTML. // parser 包负责 HTML 解析:从网页 HTML 中提取标题、描述、正文和所有超链接。 package parser import ( "path" // 路径处理(提取目录、规范化相对路径) "regexp" // 正则表达式(空白字符替换) "strings" // 字符串操作 "golang.org/x/net/html" // 标准 HTML 解析器(将 HTML 解析为 DOM 树) ) // wsRe 空白字符正则:将任意连续空白字符(空格、换行、制表符等)替换为单个空格。 var wsRe = regexp.MustCompile(`\s+`) // ParseHTML 解析 HTML 文档,返回标题、meta 描述、正文文本和所有超链接列表。 // body:原始 HTML 字符串;baseURL:用于解析相对链接的基准 URL。 func ParseHTML(body, baseURL string) (title, description, text string, hrefs []string) { // 从 baseURL 提取基准协议和主机(如 "https://example.com") base := baseFromURL(baseURL) // 从 baseURL 提取当前页面路径(如 "/path/page.html") basePath := pathFromURL(baseURL) // 将 HTML 字符串解析为 DOM 树 doc, err := html.Parse(strings.NewReader(body)) if err != nil { return // 解析失败返回空 } var textParts []string // 收集所有正文文本片段 // 深度优先遍历 DOM 树 var dfs func(n *html.Node) dfs = func(n *html.Node) { if n.Type == html.ElementNode { tag := strings.ToLower(n.Data) // 跳过