美文网首页
go解析html

go解析html

作者: 岑吾 | 来源:发表于2021-12-21 22:33 被阅读0次

    在go中可以使用goquery库来解析html,这个有点类似于jQuery的库,提供与 jQuery 相近的接口。

    一、安装

    go get -u github.com/PuerkitoBio/goquery
    

    二、使用

    1. 创建goquery对象

    使用NewDocument简单的创建,但不推荐这么用,建议使用http.Get()成功后,装body传给NewDocumentFromReader创建

    doc, err := goquery.NewDocument("https://zengwu.com.cn")
    

    使用NewDocumentFromReader创建还可以从本地文件或内存中构造对象

    res, err := http.Get("https://zengwu.com.cn")
      if err != nil {
        log.Fatal(err)
      }
      defer res.Body.Close()
      if res.StatusCode != 200 {
        log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
      }
    
      doc, err := goquery.NewDocumentFromReader(res.Body)
      if err != nil {
        log.Fatal(err)
      }
    

    2. 查找head中数据

    <html class="theme-next pisces use-motion" lang="zh-CN">
    <head>
      <meta charset="UTF-8"/>
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
      <meta name="theme-color" content="#222">
      ...
    
    

    如有以上网页头数据,我们要找出charset编码

        // 查找head
        head := doc.Find("head")
        
        // 查找meta属性项charset
        charset := head.Find("meta[charset]")
        
        // 获取charset中的charset属性值
        str, _ := charset.Attr("charset")
    
        fmt.Println(str)
    

    3. 查找html中的id

    <nav class="site-nav">
        <ul id="menu" class="menu">
            <li class="menu-item menu-item-home">
              <a href="/" rel="section">
                  <i class="menu-item-icon fa fa-fw fa-home"></i> <br /> 首页
              </a>
            </li>
    ...
    

    如有以上网页头数据,要找出id为menu的项

    menu := doc.Find("#menu")
    

    4. 查找html中的class

    还是上面代码,要找出nav class为site-nav的项

    menu := doc.Find("nav.site-nav")
    

    5. 查找所有div或列表数据

    <div class="pull-left" style="white-space:nowrap">
        01-01
        <a href="/p/26da89a5.html" title="将阿里云盘映射成本地磁盘">将阿里云盘映射成本地磁盘</a>
    </div><br>
    
    <div class="pull-left" style="white-space:nowrap">
        12-05
        <a href="/p/c1edbab3.html" title="bat中的enabledelayedexpansion">bat中的enabledelayedexpansion</a>
    </div><br>
    
    <div class="pull-left" style="white-space:nowrap">
        11-21
        <a href="/p/afe6edd9.html" title="Nginx配置跨域">Nginx配置跨域</a>
    </div><br>
    
    <div class="pull-left" style="white-space:nowrap">
        11-19
        <a href="/p/e334394.html" title="curl发送POST请求">curl发送POST请求</a>
    </div><br>
    
    <div class="pull-left" style="white-space:nowrap">
        11-18
        <a href="/p/334d5fc9.html" title="Java中byte数组和String字符串相互转换">Java中byte数组和String字符串相互转换</a>
    </div><br>
    

    找出所有class为pull-left的div,然后在每个div下搜索<a>,获取<a>的显示文本内容

        var txt = []string{}
        doc.Find("div.pull-left").Each(func(i int, s *goquery.Selection) {
            a := s.Find("a").Text()
            txt = append(txt, a)
        })
    
        fmt.Println(txt)
    

    相关文章

      网友评论

          本文标题:go解析html

          本文链接:https://www.haomeiwen.com/subject/oqrfqrtx.html