Html 解析利器-goquery
Html 解析利器-goquery
一、簡介
什麼是 goquery?
goquery 是由 Go 實現的基於 Go 的 net/html 包和 CSS 選擇器庫 cascadia 的 HTML 解析庫。
由於net/html解析器需要UTF-8編碼,goquery也同樣需要,所以需要確保提供的html是UTF-8編碼。
為什麼用 goquery?
由於 net/html 解析器返回的是節點,而不是功能齊全的 DOM 樹,所以在使用的過程中 goquery 可以提供更便利的操作。
二、快速上手
我們先對微博熱搜進行一個簡單的解析,列印當日的熱搜排名標題以及熱度。
package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"log"
"net/http"
)
type Data struct {
number string
title string
heat string
}
func main() {
// 爬取微博熱搜網頁
res, err := http.Get("https://s.weibo.com/top/summary")
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)
}
//將html生成goquery的Document
dom, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatalln(err)
}
var data []Data
// 篩選class為td-01的元素
dom.Find(".td-01").Each(func(i int, selection *goquery.Selection) {
data = append(data, Data{number: selection.Text()})
})
// 篩選class為td-02的元素下的a元素
dom.Find(".td-02>a").Each(func(i int, selection *goquery.Selection) {
data[i].title = selection.Text()
})
// 篩選class為td-02的元素下的span元素
dom.Find(".td-02>span").Each(func(i int, selection *goquery.Selection) {
data[i].heat = selection.Text()
})
fmt.Println(data)
}
列印結果為:
[{ 網路安全有你有我 3026574} {1 任豪道歉 1635306} {2 劉鑫方稱對江歌遇害不擔責 1398449} {3 小米摺疊屏開售 977369} {4 姜素拉產女 952863} {5 17元吃海底撈 718468} {6 那英 我只配給沈騰楊洋伴唱 634544} {7 日本船東要求埃及打一折 575670} {8 癌症早期幾乎無症狀 547113} {9 央行稱要重視理工科教育 540756} {10 李寧回應天價鞋 540379} {11 任豪 外網 537050} {12 謝楠汪聰主持山河令演唱會 531075} {13 偶遇張小斐為李煥英掃墓 506813} {14 FBI
每10小時啟動一項對中國的新調查 503616} {15 義大利海域遭水母入侵 495294} {16 山河令演唱會票價 486933} {17 劉以豪被娜扎親出口紅印 484077} {18 吳前 473968} {19 科學家成功捕獲黑洞多波段指紋 468128} {20 宋佳袁詠儀發海報裁掉對方 462762} {21 鄭州一中學通報女學生墜樓事件 453126} {22 72年前她身穿旗袍運送絕密情報 451299} {23 張雨綺李柄熹 娛樂圈姐弟戀甜寵文 414856} {24 多肉楊梅奶茶 397879} {25 創4總決賽繪畫撐腰大賽 380987} {26 中
學小賣部承包3年拍出320萬 347615} {27 北京沙塵暴 325600} {28 羅永浩再回應被強制執行 313570} {29 在營P2P網貸機構全部停業 311420} {30 多名教師毆打幼兒被園方辭退 294579} {31 我國連續4年多未發生暴恐案事件 285303} {32 蜘蛛俠3中文片名 282589} {33 娜扎護士裝造型 278113} {34 王霜說在巴黎不被尊重 267191} {35 王佑碩鼻子 250443} {36 吳磊一鏡到底哭戲 249606} {37 秦嶺大熊貓上樹折櫻桃花 249071} {38 警方通報瀋陽1死2傷持刀傷人案 248500
} {39 2020年中國群眾安全感指數98.4% 246917} {40 你見過哪些海王操作 246148} {41 商務部回應日本處置福島核廢水 244992} {42 一組資料看平安中國 244345} {43 趙文瑄 243697} {44 內蒙古沙塵暴風沙夾雜雨雪 242044} {45 油價或迎年內首次擱淺 241157} {46 庫裡的進攻能力在NBA排第幾 239944} {47 在家長群搶30個紅包被拘 239808} {48 明白做老師不易的瞬間 207204} {49 張哲瀚OK週年刊封面 206645} {50 輕混血濃顏泰妝 }]
三、過濾器示例
基於 HTML Element 元素的選擇器
使用 Element 名稱作為選擇器,如 dom.Find("div")。
dom.Find("div").Each(func (i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
ID 選擇器
以 # 加 id 值作為選擇器
dom.Find("#id").Each(func (i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
Class 選擇器
以.加 class 值為選擇器
dom.Find(".class").Each(func (i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
由上面的示例可以看出,goquery 的選擇器與 jQuery 的選擇器用法無異,在這裡就不繼續贅述了,同學們可以自行探索。
四、常用節點屬性值
Html() 獲取該節點的 html
dom.Find("table").Each(func (i int, selection *goquery.Selection) {
fmt.Println(selection.Html())
})
Text() 獲取該節點的文字值
dom.Find(".td-02>a").Each(func (i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
Attr() 返回節點的屬性值以及該屬性是否存在的布林值
dom.Find("#execution").Each(func (i int, selection *goquery.Selection) {
value[i], ok = selection.Attr("value")
})
Length() 返回該 Selection 的元素個數
dom.Find("td").Length()
閒言
這個庫用起來非常容易上手,尤其是對 jQuery 熟悉的同學,極大地提升了開發效率。
之前都是用 Python 寫爬蟲,使用 BeautifulSoup 進行解析,十分方便。第一次用 go 的 net/html 嘗試解析的時候,花了很多不必要的時間,直到後來發現了 goquery,才找回了用 BeautifulSoup 的感覺。
友情提示:爬蟲有風險,請務必遵守法律法規。
參考文件:
- https://github.com/PuerkitoBio/goquery
- https://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html
歡迎加入我們 GOLANG 中國社群:https://gocn.vip/
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Java爬蟲利器HTML解析工具-JsoupJava爬蟲HTMLJS
- goqueryGo
- RAG文件解析利器:Deepdoc
- HTML解析HTML
- 解析-HTML 解析器HTML
- JMeter:效能測試利器全解析JMeter
- node上HTML分析利器node-jquery 薦HTMLjQuery
- iOS TFHpple解析htmliOSHTML
- c#解析HTMLC#HTML
- golang goquery selector(選擇器) 示例大全Golang
- 有沒有用過goquery的,我想用代理去爬蟲,goquery支援嗎?找了一下好像沒找到Go爬蟲
- golang解析html出錯GolangHTML
- Python 3 解析 htmlPythonHTML
- HTML解析元件HtmlAgilityPack使用HTML元件
- 檢視html元素繫結的事件與方法的利器HTML事件
- html新增結構元素解析HTML
- Html5 History API解析HTMLAPI
- 解析程式碼的利器 Spp 語法描述語言
- [原]Android官方圖片載入利器BitmapFun解析Android
- 解析Linux網路分析的三大利器(轉)Linux
- Golang+chromedp+goquery 簡單爬取動態資料GolangChrome
- iOS 輕量級 HTML 解析方案iOSHTML
- 使用C#和HtmlAgilityPack解析HTMLC#HTML
- 【Java】Jsoup 解析HTML報告JavaJSHTML
- 資料分析利器:XGBoost演算法最佳解析演算法
- RSS 解析:全球內容分發的利器及使用技巧
- 前端利器!讓AI根據手繪原型生成HTML | 教程+程式碼前端AI原型HTML
- 使用Jsoup解析Html == TextView顯示html圖片的方法JSHTMLTextView
- Python解析XML檔案生成HTMLPythonXMLHTML
- 爬蟲-使用lxml解析html資料爬蟲XMLHTML
- Java正則解析HTML一例JavaHTML
- 【Java利器】JDK5-9新特性解析+程式碼 - JDK7JavaJDK
- 深入解析webpack 外掛html-webpack-pluginWebHTMLPlugin
- 瀏覽器是如何解析html的?瀏覽器HTML
- 菜鳥提問:如何用java解析htmlJavaHTML
- Java中使用Jsoup解析HTML表格教程JavaJSHTML
- JAVA 解析html 型別字串(使用jsoup)JavaHTML型別字串JS
- [網路爬蟲] Jsoup : HTML 解析工具爬蟲JSHTML