golang 網頁解析 goquer包 簡介

2020-08-10 17:40:48

目錄

安裝

載入頁面

獲得document物件

選擇元素

Selection型別提供的方法


goquery github地址 https://github.com/PuerkitoBio/goquery

安裝

由於它依賴 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…()