商城首页欢迎来到中国正版软件门户

您的位置:首页 >Golang解析HTML方法详解

Golang解析HTML方法详解

  发布于2026-03-09 阅读(0)

扫一扫,手机访问

必须先调用 html.Parse() 或 html.ParseFragment() 构建 DOM 树,不可直接操作 html.Node;Parse 用于完整 HTML 文档,需 io.Reader 输入;ParseFragment 适用于 HTML 片段。

如何在Golang中解析HTML页面_Golang net/html HTML解析方法

net/html 解析 HTML 时,必须先调用 html.Parse() 获取根节点

直接对原始 HTML 字符串调用 html.Node 相关操作会 panic,因为没有解析器上下文。必须先通过 html.Parse()html.ParseFragment() 构建 DOM 树。

  • html.Parse() 用于完整 HTML 文档(含 <html><head> 等),输入需是 io.Reader,常见用法:
    doc, err := html.Parse(strings.NewReader(htmlStr))
    if err != nil {
        log.Fatal(err)
    }
  • html.ParseFragment() 适合解析片段(如仅 <div>...),需传入一个“上下文节点”(如 &html.Node{Type: html.ElementNode, Data: "body"}),否则可能丢节点或 panic
  • 注意:解析器不校验编码,默认按 UTF-8 处理;若 HTML 声明为 gbkutf-8 但实际字节非 UTF-8,会读出乱码甚至提前截断

遍历节点时,node.Typenode.Data 更可靠

很多新手误以为查 node.Data == "div" 就能定位元素,但 Data 在不同 Type 下含义不同:文本节点存内容,注释节点存注释文字,元素节点才存标签名。漏判 Type 会导致逻辑错位或空指针。

  • 关键类型常量:html.ElementNode(标签)、html.TextNode(文本)、html.CommentNode(注释)、html.DoctypeNode(doctype)
  • 安全遍历示例:
    func findDivs(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "div" {
            // 处理 div 元素
            fmt.Println("found div")
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            findDivs(c)
        }
    }
  • 不要依赖 n.DataAtom —— 它是内部优化字段,未导出且仅在特定构建下有效,跨平台或新版 Go 可能失效

node.Attr 是切片,查属性必须遍历,没有 GetAttribute() 这种方法

Go 的 net/html 不提供类似 jQuery 的 attr("href") 便捷接口,所有属性访问都得手动循环 node.Attr 切片比对 Key

  • 常见错误:写成 node.Attr["href"] —— 编译失败,因为 Attr[]html.Attribute 类型,不是 map
  • 正确写法:
    func getHref(n *html.Node) (href string) {
        for _, a := range n.Attr {
            if a.Key == "href" {
                href = a.Val
                break
            }
        }
        return href
    }
  • 注意大小写:HTML 属性名不区分大小写,但 net/html 不做归一化,"HREF""href" 被视为不同 key;生产环境建议统一转小写再比较

解析后不调用 html.Render() 就无法还原 HTML 字符串

如果你从网页提取结构后想拼回 HTML 片段(比如清洗后重新生成),不能靠字符串拼接,必须用 html.Render() 写入 io.Writer。否则丢失转义、闭合逻辑、自闭合标签处理(如 <img>)等细节。

  • html.Render() 会自动处理特殊字符转义(如 <&lt;)、标签闭合、空白压缩策略(取决于节点类型)
  • 简单还原示例:
    var buf bytes.Buffer
    err := html.Render(&buf, doc)
    if err != nil {
        log.Fatal(err)
    }
    htmlOut := buf.String() // 此时才是合法可渲染的 HTML
  • 注意:若只取部分子树(如某个 <div>),要确保其作为独立片段可渲染 —— 比如 <table> 子节点单独 render 可能缺 <tbody>,浏览器容错强,但服务端处理时需留意
解析 HTML 最容易被忽略的是编码推断和错误恢复机制:net/html 在遇到非法嵌套(如 <p><div></p></div>)时会自动修复 DOM 结构,这和浏览器一致,但也意味着你写的 XPath 或层级假设可能在意外情况下失效。
本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
  • 小青账如何隐藏默认账本?小青账隐藏默认账本教程 正版软件
    小青账如何隐藏默认账本?小青账隐藏默认账本教程
    小青账如何隐藏默认账本?小青账是一款非常实用且强大的记账软件,为广大用户提供了方便的记账功能。不少用户对如何隐藏默认账本感到困惑,下面小编将介绍小青账隐藏默认账本的操作方法。还不知道的小伙伴快来看看吧!
    16小时前 13:05 0
  • 如何使用讯飞星火生成ppt?利用讯飞星火AI生成高质量ppt教程 正版软件
    如何使用讯飞星火生成ppt?利用讯飞星火AI生成高质量ppt教程
    讯飞星火怎么生成高质量ppt?你是否曾经在深夜里为第二天的工作汇报而焦头烂额,翻遍互联网寻找灵感和模板,又或者因为繁琐的排版和设计而感到力不从心?现在,有了讯飞星火AI生成PPT,你的所有烦恼都将一扫而光!
    16小时前 12:52 0
  • 搜狐视频怎么投屏到电视播放?搜狐视频app电视投屏方法教程 正版软件
    搜狐视频怎么投屏到电视播放?搜狐视频app电视投屏方法教程
    搜狐视频怎么投屏到电视播放?有时候我们在看电视的时候会觉得怕屏幕不够大,看的不大清楚,这时候就会想如果有个大屏幕就好了,今天小编教你们如何用搜狐视频投屏到电视上,彻底的解放双手。搜狐视频app电视投屏教程1、首先打开搜狐视频app,搜索想看的视频或影视剧2、进入详情页后点击有TV字样的图标3、然后搜索附近的设备连接我们的电视4、当电视上出现了手机正在播放的
    16小时前 12:38 0
  • 豆瓣怎么设置主页不可见?豆瓣设置隐私主页教程 正版软件
    豆瓣怎么设置主页不可见?豆瓣设置隐私主页教程
    豆瓣怎么设置主页不可见?大家在使用豆瓣的时候,经常会在主页发布自己的心情状态、吐槽等等内容,然后其他用户进我们的主页的时候就能很轻松的看到我们发过的内容,那么我们能不能设置主页的隐私呢?要怎么设置呢?下面小编就为大家介绍一下豆瓣个人主页设置隐私的办法。
    18小时前 10:50 0
  • 夸克浏览器怎么设置电脑模式?夸克浏览器设置成电脑模式教程 正版软件
    夸克浏览器怎么设置电脑模式?夸克浏览器设置成电脑模式教程
    夸克浏览器怎么设置电脑模式?嘿,兄弟们,你是否曾经需要在手机上看网页,但又要让页面显示效果如同在电脑上的体验?如果是,那么恭喜您,夸克浏览器就是您的不二之选!它不仅拥有简洁明了的界面设计,而且夸克浏览器手机版也可以轻松设置成电脑版,让你在手机端也能够享受到如同在电脑上的浏览体验。
    昨天 03-21 12:02 0

热门关注