
本文详解使用 golang.org/x/net/html 包解析 HTML,实现按层级(如每行第二列 )提取文本,并安全提取 子树为独立 HTML 片段。
本文详解使用 `golang.org/x/net/html` 包解析 html,实现按层级(如每行第二列 `
package main
import (
"fmt"
"strings"
"golang.org/x/net/html"
)
func extractSecondTD(htmlStr string) []string {
var results []string
r := strings.NewReader(htmlStr)
z := html.NewTokenizer(r)
inTR := false
tdIndex := 0
for {
tt := z.Next()
switch tt {
case html.ErrorToken:
return results
case html.StartTagToken:
t := z.Token()
if t.Data == "tr" {
inTR = true
tdIndex = 0
} else if t.Data == "td" && inTR {
if tdIndex == 1 {
// 下一个 token 应为 TextToken(忽略空格/换行需 trim)
if next := z.Next(); next == html.TextToken {
text := strings.TrimSpace(z.Token().Data)
if text != "" {
results = append(results, text)
}
}
}
tdIndex++
}
case html.EndTagToken:
t := z.Token()
if t.Data == "tr" {
inTR = false
}
}
}
}
var sampleHTML = `
| A1 | Apple | X1 |
| B1 | Banana | X2 |
| C1 | Cherry | X3 |
import "golang.org/x/net/html/atom"
func extractTableHTML(htmlStr string) (string, error) {
doc, err := html.Parse(strings.NewReader(htmlStr))
if err != nil {
return "", err
}
var findTable func(*html.Node) *html.Node
findTable = func(n *html.Node) *html.Node {
if n.Type == html.ElementNode && n.Data == "table" {
return n
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
if found := findTable(c); found != nil {
return found
}
}
return nil
}
tableNode := findTable(doc)
if tableNode == nil {
return "", fmt.Errorf("table tag not found")
}
var buf strings.Builder
if err := html.Render(&buf, tableNode); err != nil {
return "", err
}
return buf.String(), nil
}
// 使用示例:
// result, _ := extractTableHTML(fullPageHTML)
// fmt.Println(result) // 输出纯
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











