基于net/html重构解析模块遇nil结果:需提取截图指定数据
问题分析与解决
你的代码存在几个关键问题,导致返回nil:
html.Parse返回的doc是整个HTML文档的根节点(通常是<html>标签),直接判断它的Data等于profile-data__count-number完全错误,这个值是元素的class属性,不是标签名(doc.Data存储的是标签名称,比如span、div)。- 你试图查找
Key为em的属性,但em是HTML标签,不是元素的属性,逻辑完全偏离。 - 没有遍历DOM树,net/html不会自动帮你定位到深层节点,必须手动递归或迭代遍历所有节点。
根据截图里的结构(下划线标记的是<em>标签内的数值,该标签被包含在class为profile-data__count-number的元素中),以下是修正后的代码:
package main import ( "fmt" "net/http" "strings" "golang.org/x/net/html" ) func main() { link := "你的目标URL" resp, err := http.Get(link) if err != nil { fmt.Println(err) return } defer resp.Body.Close() // 用defer确保关闭,避免资源泄漏 doc, err := html.Parse(resp.Body) if err != nil { fmt.Println(err) return } var result string // 递归遍历DOM节点 var traverse func(*html.Node) traverse = func(n *html.Node) { // 先检查当前节点是否是class为profile-data__count-number的元素 if n.Type == html.ElementNode { for _, attr := range n.Attr { if attr.Key == "class" && strings.Contains(attr.Val, "profile-data__count-number") { // 在该元素下查找em子节点 for child := n.FirstChild; child != nil; child = child.NextSibling { if child.Type == html.ElementNode && child.Data == "em" { // 提取em标签内的文本 if child.FirstChild != nil && child.FirstChild.Type == html.TextNode { result = child.FirstChild.Data return } } } } } } // 遍历子节点 for child := n.FirstChild; child != nil; child = child.NextSibling { traverse(child) if result != "" { // 找到结果后提前退出 return } } } traverse(doc) fmt.Println(result) }
关键修正点:
- 使用
defer resp.Body.Close()确保响应体正确关闭,避免资源泄漏。 - 编写递归遍历函数
traverse,逐个检查DOM节点。 - 先定位到class包含
profile-data__count-number的元素,再在其子节点中查找<em>标签。 - 提取
<em>标签内的文本节点内容,这才是你需要的下划线标记数据。
内容的提问来源于stack exchange,提问作者hey
相关产品推荐
相关产品推荐

