You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取HTML标签的innerHTML或纯文本?Go语言用指定库提取锚点文本

用golang.org/x/net/html获取HTML标签的文本内容

先纠正你现有代码的问题

你当前的代码逻辑错误:html.TextNode类型节点的Data字段是文本内容,而标签名(如"a")是html.ElementNode类型节点的Data字段,所以你的条件n.Type == html.TextNode && n.Data == "a"永远不会匹配到a标签。


1. 获取标签的纯文本内容(如示例中a标签的"Text XYZ")

需要递归遍历目标标签的子节点,收集所有html.TextNode的内容,可按需过滤空白字符:

import (
    "golang.org/x/net/html"
    "strings"
)

// 递归收集节点下的所有纯文本
func getTextContent(node *html.Node) string {
    var text strings.Builder
    var traverse func(*html.Node)
    traverse = func(n *html.Node) {
        if n.Type == html.TextNode {
            // 过滤无效空白(可选,根据需求调整)
            trimmed := strings.TrimSpace(n.Data)
            if trimmed != "" {
                text.WriteString(trimmed)
            }
        }
        // 遍历所有子节点
        for child := n.FirstChild; child != nil; child = child.NextSibling {
            traverse(child)
        }
    }
    traverse(node)
    return text.String()
}

// 遍历HTML树找到a标签并提取文本
func extractAText(doc *html.Node) string {
    var aText string
    var findA func(*html.Node)
    findA = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            aText = getTextContent(n)
            return // 找到第一个a标签即返回,如需全部可存入切片
        }
        for child := n.FirstChild; child != nil; child = child.NextSibling {
            findA(child)
        }
    }
    findA(doc)
    return aText
}

2. 获取标签的innerHTML(包含子标签的HTML结构)

使用html.Render函数将目标标签的子节点渲染为HTML字符串:

import (
    "bytes"
    "golang.org/x/net/html"
)

// 获取节点的innerHTML内容
func getInnerHTML(node *html.Node) (string, error) {
    var buf bytes.Buffer
    // 遍历并渲染所有子节点
    for child := node.FirstChild; child != nil; child = child.NextSibling {
        if err := html.Render(&buf, child); err != nil {
            return "", err
        }
    }
    return buf.String(), nil
}

// 找到a标签并提取其innerHTML
func extractAInnerHTML(doc *html.Node) (string, error) {
    var innerHTML string
    var err error
    var findA func(*html.Node)
    findA = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            innerHTML, err = getInnerHTML(n)
            return
        }
        for child := n.FirstChild; child != nil; child = child.NextSibling {
            findA(child)
        }
    }
    findA(doc)
    return innerHTML, err
}

修正你获取href+文本的逻辑

结合上面的方法,正确获取a标签的href和文本:

// 遍历到a标签节点时的处理逻辑
if n.Type == html.ElementNode && n.Data == "a" {
    // 提取href属性
    var href string
    for _, attr := range n.Attr {
        if attr.Key == "href" {
            href = attr.Val
            break
        }
    }
    // 提取文本内容
    text := getTextContent(n)
    
    // 这里可以使用href和text做后续处理
}

内容的提问来源于stack exchange,提问作者Mr Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:30:52