package main import ( "bytes" "fmt" "golang.org/x/net/html" "strings" ) // CleanHTMLTags 处理HTML内容并返回清理后的文本 func CleanHTMLTags(htmlContent string) (string, error) { // 解析HTML内容 doc, err := html.Parse(strings.NewReader(htmlContent)) if err != nil { return "", err } var buf bytes.Buffer // 递归函数,用来遍历 HTML 树 var f func(*html.Node) f = func(n *html.Node) { // 处理文本节点 if n.Type == html.TextNode { buf.WriteString(n.Data) } // 处理元素节点 if n.Type == html.ElementNode { // 调试:输出当前节点的类型和标签名 fmt.Printf("ElementNode: %s\n", n.Data) // 处理
标签,插入换行 if n.Data == "br" { buf.WriteString("\n") } else if n.Data == "table" { // 处理表格标签 //buf.WriteString("\nTable Start\n") for tr := n.FirstChild; tr != nil; tr = tr.NextSibling { if tr.Type == html.ElementNode && tr.Data == "tr" { //buf.WriteString("\nRow Start\n") // 遍历每行中的 ,处理每个
单元格 for td := tr.FirstChild; td != nil; td = td.NextSibling { if td.Data == "td" { buf.WriteString("[TD] ") f(td) // 递归处理 中的内容 } } //buf.WriteString("\nRow End\n") } } //buf.WriteString("Table End\n") } else if n.Data == "ul" { // 处理无序列表
    //buf.WriteString("\nList Start\n") for li := n.FirstChild; li != nil; li = li.NextSibling { if li.Data == "li" { buf.WriteString("- ") f(li) buf.WriteString("\n") } } //buf.WriteString("List End\n") } } // 遍历子节点 for child := n.FirstChild; child != nil; child = child.NextSibling { f(child) } } // 启动递归遍历 f(doc) // 去除多余空格 trimmedText := strings.TrimSpace(buf.String()) return trimmedText, nil } // CleanHTMLTags 用于提取HTML内容,保留段落格式(例如
    ),并处理表格等标签 func CleanHTMLTags11(htmlContent string) (string, error) { // 解析HTML内容 doc, err := html.Parse(strings.NewReader(htmlContent)) if err != nil { return "", err } var buf bytes.Buffer var f func(*html.Node) // 遍历每个节点 // 改进后的处理代码 f = func(n *html.Node) { switch n.Type { case html.TextNode: // 处理文本节点,保留文本内容 buf.WriteString(n.Data) case html.ElementNode: // 针对
    标签添加换行符 if n.Data == "br" { buf.WriteString("\n") } else if n.Data == "p" { // 对

    标签处理,增加换行符 buf.WriteString("\n") } else if n.Data == "ul" { // 对

      列表元素进行处理,换行并处理每个
    • for li := n.FirstChild; li != nil; li = li.NextSibling { if li.Data == "li" { buf.WriteString("- ") f(li) buf.WriteString("\n") } } } else if n.Data == "table" { // 处理表格结构,换行并处理每一行 for tr := n.FirstChild; tr != nil; tr = tr.NextSibling { if tr.Type == html.ElementNode && tr.Data == "tr" { // 每一行之前先换行 buf.WriteString("\n") // 对于每一行
for td := tr.FirstChild; td != nil; td = td.NextSibling { if td.Data == "td" { f(td) buf.WriteString(" | ") // 分隔单元格 } } buf.WriteString("\n") // 每行结束后换行 } } } } // 递归遍历子节点 for child := n.FirstChild; child != nil; child = child.NextSibling { f(child) } } // 开始解析 f(doc) // 返回提取后的文本内容 return buf.String(), nil }