如何获取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
相关产品推荐
相关产品推荐

