目录

安装

由于它依赖 Go语言的 net/html 包以及css选择库 cascadia, 因此我们要先手动安装net/html包,后者不需要我们手动安装。
运行

go get https://github.com/PuerkitoBio/goquery

之后可能会出现golang.org\x失败相关的,那里是由于被墙了导致(好像又不是o_o ....),那里自己百度下吧,具体错误我当时也没记录( ̄、 ̄)

然后应该就可以使用goquery包了

语法相关这里就不过分说明,直接上用法吧(●'◡'●)

首先导入该包

import  "github.com/PuerkitoBio/goquery"

加载页面

就用官方的例子吧,我比较懒

  // 请求html页面
  res, err := http.Get("http://metalsucks.net")
  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)
  }

获得document对象

有多种获得document对象的方法,这里是比较常见的一种

  // 加载 HTML document对象
  doc, err := goquery.NewDocumentFromReader(res.Body)
  if err != nil {
    log.Fatal(err)
  }

选择元素

选择器语法就是css选择器语法,和jsoup中的类似

  // Find the review items
  doc.Find(".sidebar-reviews article .content-block").Each(func(i int, s *goquery.Selection) {
    // For each item found, get the band and title
    band := s.Find("a").Text()
    title := s.Find("i").Text()
    fmt.Printf("Review %d: %s - %s\n", i, band, title)
  })

要爬取的即是图中的内容

运行结果

 

Selection类型提供的方法

这些方法是页面解析最重要,最核心的方法

1)类似函数的位置操作

   -  Eq(index int) *Selection     //根据索引获取某个节点集

  -  First() *Selection          //获取第一个子节点集

  -  Last() *Selection         //获取最后一个子节点集

  -  Next() *Selection         //获取下一个兄弟节点集

  -  NextAll() *Selection      //获取后面所有兄弟节点集

  -  Prev() *Selection         //前一个兄弟节点集

  - Get(index int) *html.Node  //根据索引获取一个节点

  - Index() int                //返回选择对象中第一个元素的位置 

  - Slice(start, end int) *Selection  //根据起始位置获取子节点集

 

2)扩大 Selection 集合(增加选择的节点)

    -  Add(selector string) *Selection //将匹配到的节点添加当前节点集合中

    -   AndSelf() *Selection    //将堆栈上的前一组元素添加到当前的

     -    Union() *Selection    //which is an alias for AddSelection()

 

3)过滤方法,减少节点集合

   -  End() *Selection

    - Filter…()     //过滤

    - Has…()
    - Intersection()   //which is an alias of FilterSelection()
     - Not…()

 

4)循环遍历选择的节点

         -  Each(f func(int, *Selection)) *Selection //遍历

        - EachWithBreak(f func(int, *Selection) bool) *Selection  //可中断遍历

       - Map(f func(int, *Selection) string) (result []string)  //返回字符串数组

 

 5)修改文档

      - After…()            //在匹配元素之后追加元素
      - Append…()         //将选择器指定的元素添加到匹配元素集合的每个元素的末尾
     - Before…()          //在匹配元素之前追加元素
    - Clone()             //创建匹配节点的副本
    - Empty()            //清空子节点
    - Prepend…()
    - Remove…()
    - ReplaceWith…()
    - Unwrap()
    - Wrap…()
    - WrapAll…()
    - WrapInner…()

 

  6)检测或获取节点属性值

      - Attr(), RemoveAttr(), SetAttr()  //获取,移除,设置属性的值
     - AddClass(), HasClass(), RemoveClass(), ToggleClass() 
     - Html()  //获取该节点的html
     - Length() //返回该Selection的元素个数
     - Size(), which is an alias for Length()
     - Text()  //获取该节点的文本值

 

7)查询或显示一个节点的身份

     - Contains() //包含
      - Is…()

 

8)在文档树之间来回跳转(常用的查找节点方法)

      - Children…()
      - Contents()
      - Find…()
      - Next…()
      - Parent[s]…()
      - Prev…()
      - Siblings…()