go解析html

在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下搜索,获取的显示文本内容

    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)
0%