目錄
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物件的方法,這裏是比較常見的一種
// 載入 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)
})
要爬取的即是圖中的內容
執行結果
這些方法是頁面解析最重要,最核心的方法
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…()