跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在 goquery 中获取 DOM 元素的标签名称(如 a、img、tr)

使用 goquery 时,可通过访问 Selection.Nodes 切片中 *html.Node 的 Data 字段直接获取 DOM 元素的标签名,需确保节点类型为 html.ElementNode。 使用 goquery 时,可通过访问 `selection.nodes` 切片中 `*html.node` 的 `data` 字段直接获取 dom 元素的标签名,需确保节点类型为 `html.elementnode`。 在 goquery 中,*goquery.Selection 封装了一组 HTML 节点([]*html.Node),但其 API 并未提供直接获取标签名的便捷方法(如 .TagName())。要提取元素类型(即 HTML 标签名,例如 "a"、"img"、"tr"、"center"),必须底层访问 s.Nodes 并检查节点结构。 核心要点如下: s.Nodes 是一个 []*html.Node 切片,每个 *html.Node 包含: Type: 节点类型(如 html.ElementNode、html.TextNode 等); Data: 对于 ElementNode,该字段即为小写的标签名(如 "div"、"center");对于 TextNode,则是文本内容。 务必校验 len(s.Nodes) > 0 和 node.Type == html.ElementNode ,否则可能 panic 或返回意外值(如空字符串或文本内容)。 以下是一个完整、健壮的示例:
package main import ( "fmt" "github.com/PuerkitoBio/goquery" "golang.org/x/net/html" ) func main() { doc, err := goquery.NewDocument("https://news.ycombinator.com/") if err != nil { panic(err) } // 查找所有直接子元素(例如 body 下的 immediate children) doc.Find("body > *").Each(func(_ int, s *goquery.Selection) { if len(s.Nodes) == 0 { return } node := s.Nodes[0] if node.Type == html.ElementNode { fmt.Printf("Tag name: %q\n", node.Data) // 输出如 "center", "table", "div" 等 } }) }
⚠️ 注意事项: s.First() 返回的是新的 *Selection,不简化取名逻辑——仍需访问其 Nodes; HTML 解析是大小写不敏感的,node.Data 始终为小写(如
也会返回 "center"); 若选择器匹配到文本节点、注释节点等,node.Data 不代表标签名,必须通过 node.Type 过滤; 生产环境应始终检查 err(如 NewDocument 失败)和边界条件(如空 selection)。 总结:goquery 本身不封装“获取标签名”的高层方法,但借助 html.Node.Data 可安全、高效地提取——关键在于理解 selection 与底层 HTML 节点的映射关系,并做好类型与空值防护。

相关文章