<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【GoCN酷Go推薦】Html解析利器-goquery庫(kù)

          共 5496字,需瀏覽 11分鐘

           ·

          2021-04-19 15:42

          簡(jiǎn)介

          什么是goquery?

          goquery是由Go實(shí)現(xiàn)的基于Go的net/html包和CSS選擇器庫(kù)cascadia的HTML解析庫(kù)。

          由于net/html解析器需要UTF-8編碼,goquery也同樣需要,所以需要確保提供的html是UTF-8編碼。

          為什么用goquery?

          由于net/html解析器返回的是節(jié)點(diǎn),而不是功能齊全的DOM樹,所以在使用的過(guò)程中g(shù)oquery可以提供更便利的操作。


          快速上手 

          我們先對(duì)微博熱搜進(jìn)行一個(gè)簡(jiǎn)單的解析,打印當(dāng)日的熱搜排名標(biāo)題以及熱度。

          package main

          import (
           "fmt"
           "github.com/PuerkitoBio/goquery"
           "log"
           "net/http"
          )

          type Data struct {
           number string
           title  string
           heat   string
          }

          func main() {
           // 爬取微博熱搜網(wǎng)頁(yè)
           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)
          }

          打印結(jié)果為:

          [{ 網(wǎng)絡(luò)安全有你有我 3026574} {1 任豪道歉 1635306} {2 劉鑫方稱對(duì)江歌遇害不擔(dān)責(zé) 1398449} {3 小米折疊屏開售 977369} {4 姜素拉產(chǎn)女 952863} {5 17元吃海底撈 718468} {6 那英 我只配給沈騰楊洋伴唱 634544} {7 日本船東要求埃及打一折 575670} {8 癌癥早期幾乎無(wú)癥狀 547113} {9 央行稱要重視理工科教育 540756} {10 李寧回應(yīng)天價(jià)鞋 540379} {11 任豪 外網(wǎng) 537050} {12 謝楠汪聰主持山河令演唱會(huì) 531075} {13 偶遇張小斐為李煥英掃墓 506813} {14 FBI
          每10小時(shí)啟動(dòng)一項(xiàng)對(duì)中國(guó)的新調(diào)查 503616} {15 意大利海域遭水母入侵 495294} {16 山河令演唱會(huì)票價(jià) 486933} {17 劉以豪被娜扎親出口紅印 484077} {18 吳前 473968} {19 科學(xué)家成功捕獲黑洞多波段指紋 468128} {20 宋佳袁詠儀發(fā)海報(bào)裁掉對(duì)方 462762} {21 鄭州一中學(xué)通報(bào)女學(xué)生墜樓事件 453126} {22 72年前她身穿旗袍運(yùn)送絕密情報(bào) 451299} {23 張雨綺李柄熹 娛樂(lè)圈姐弟戀甜寵文 414856} {24 多肉楊梅奶茶 397879} {25 創(chuàng)4總決賽繪畫撐腰大賽 380987} {26 中
          學(xué)小賣部承包3年拍出320萬(wàn) 347615} {27 北京沙塵暴 325600} {28 羅永浩再回應(yīng)被強(qiáng)制執(zhí)行 313570} {29 在營(yíng)P2P網(wǎng)貸機(jī)構(gòu)全部停業(yè) 311420} {30 多名教師毆打幼兒被園方辭退 294579} {31 我國(guó)連續(xù)4年多未發(fā)生暴恐案事件 285303} {32 蜘蛛俠3中文片名 282589} {33 娜扎護(hù)士裝造型 278113} {34 王霜說(shuō)在巴黎不被尊重 267191} {35 王佑碩鼻子 250443} {36 吳磊一鏡到底哭戲 249606} {37 秦嶺大熊貓上樹折櫻桃花 249071} {38 警方通報(bào)沈陽(yáng)1死2傷持刀傷人案 248500
          } {39 2020年中國(guó)群眾安全感指數(shù)98.4% 246917} {40 你見過(guò)哪些海王操作 246148} {41 商務(wù)部回應(yīng)日本處置福島核廢水 244992} {42 一組數(shù)據(jù)看平安中國(guó) 244345} {43 趙文瑄 243697} {44 內(nèi)蒙古沙塵暴風(fēng)沙夾雜雨雪 242044} {45 油價(jià)或迎年內(nèi)首次擱淺 241157} {46 庫(kù)里的進(jìn)攻能力在NBA排第幾 239944} {47 在家長(zhǎng)群搶30個(gè)紅包被拘 239808} {48 明白做老師不易的瞬間 207204} {49 張哲瀚OK周年刊封面 206645} {50 輕混血濃顏泰妝 }]


          過(guò)濾器示例 

          基于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的選擇器用法無(wú)異,在這里就不繼續(xù)贅述了,同學(xué)們可以自行探索。


          常用節(jié)點(diǎn)屬性值 

          Html() 獲取該節(jié)點(diǎn)的html
          dom.Find("table").Each(func (i int, selection *goquery.Selection) {
          fmt.Println(selection.Html())
          })
          Text() 獲取該節(jié)點(diǎn)的文本值
          dom.Find(".td-02>a").Each(func (i int, selection *goquery.Selection) {
          fmt.Println(selection.Text())
          })
          Attr() 返回節(jié)點(diǎn)的屬性值以及該屬性是否存在的布爾值
          dom.Find("#execution").Each(func (i int, selection *goquery.Selection) {
          value[i], ok = selection.Attr("value")
          })
          Length() 返回該Selection的元素個(gè)數(shù)
          dom.Find("td").Length()


          閑言

          這個(gè)庫(kù)用起來(lái)非常容易上手,尤其是對(duì)jQuery熟悉的同學(xué),極大地提升了開發(fā)效率。

          之前都是用Python寫爬蟲,使用BeautifulSoup進(jìn)行解析,十分方便。第一次用go的net/html嘗試解析的時(shí)候,花了很多不必要的時(shí)間,直到后來(lái)發(fā)現(xiàn)了goquery,才找回了用BeautifulSoup的感覺。

          友情提示:爬蟲有風(fēng)險(xiǎn),請(qǐng)務(wù)必遵守法律法規(guī)


          參考資料 


            • https://github.com/PuerkitoBio/goquery

            • https://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html

          還想了解更多嗎?

          更多請(qǐng)查看:https://github.com/PuerkitoBio/goquery

          歡迎加入我們GOLANG中國(guó)社區(qū):https://gocn.vip/


          《酷Go推薦》招募:


          各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫(kù)或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫(kù)使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到新的庫(kù),并且知道怎么用。


          大概規(guī)則和每日新聞?lì)愃疲绻麍?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名!


          點(diǎn)擊 閱讀原文 即刻報(bào)名


          — 往期回顧 —

          【GoCN酷Go推薦】Go程序配置利器-viper庫(kù)

          【GoCN酷Go推薦】Validator 網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)驗(yàn)證包

          【GoCN酷Go推薦】ip2location 解析 IP 地址庫(kù)



          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  逼特逼在线观看视频 | 日本一级操逼视频 | 色婷婷在线视频观看免费 | 国产精品内射婷婷 | 欧美日韩男女考逼视频 |