123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- 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)
- // 处理 <br> 标签,插入换行
- if n.Data == "br" {
- buf.WriteString("\n")
- } else if n.Data == "table" {
- // 处理表格标签 <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")
- // 遍历每行中的 <td> 单元格
- for td := tr.FirstChild; td != nil; td = td.NextSibling {
- if td.Data == "td" {
- buf.WriteString("[TD] ")
- f(td) // 递归处理 <td> 中的内容
- }
- }
- //buf.WriteString("\nRow End\n")
- }
- }
- //buf.WriteString("Table End\n")
- } else if n.Data == "ul" {
- // 处理无序列表 <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内容,保留段落格式(例如 <br/>),并处理表格等标签
- 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:
- // 针对 <br/> 标签添加换行符
- if n.Data == "br" {
- buf.WriteString("\n")
- } else if n.Data == "p" {
- // 对 <p> 标签处理,增加换行符
- buf.WriteString("\n")
- } else if n.Data == "ul" {
- // 对 <ul> 列表元素进行处理,换行并处理每个 <li>
- 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")
- // 对于每一行 <tr>,处理每个 <td>
- 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
- }
|