简介

什么是goquery?

goquery是由Go实现的基于Go的net/html包和CSS选择器库cascadia的HTML解析库。

由于net/html解析器需要UTF-8编码,goquery也同样需要,所以需要确保提供的html是UTF-8编码。

为什么用goquery?

由于net/html解析器返回的是节点,而不是功能齐全的DOM树,所以在使用的过程中goquery可以提供更便利的操作。

快速上手 

我们先对微博热搜进行一个简单的解析,打印当日的热搜排名标题以及热度。

package mainimport ("fmt""github.com/PuerkitoBio/goquery""log""net/http"
)type Data struct {number stringtitle  stringheat   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的Documentdom, 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

还想了解更多吗?

更多请查看:https://github.com/PuerkitoBio/goquery

欢迎加入我们GOLANG中国社区:https://gocn.vip/

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!

点击 阅读原文 即刻报名

— 往期回顾 —

【GoCN酷Go推荐】Go程序配置利器-viper库

【GoCN酷Go推荐】Validator 网络请求数据验证包

【GoCN酷Go推荐】ip2location 解析 IP 地址库

【GoCN酷Go推荐】Html解析利器-goquery库相关推荐

  1. 「GoCN酷Go推荐」go语言位操作库 — bitset

    bitset库实现了bitsets数据结构,这是一种正整数和布尔值映射关系的结构,它比map[uint]bool更高效 什么是bitsets✦ bitsets基本思想是用一个bit位来标记某个元素对应 ...

  2. 【GoCN酷Go推荐】ip2location 解析 IP 地址库

     简介 很多时候,我们获取了用户ip,但是想知道更多信息,怎么办?使用ip2location吧. 这个库,可以从IP地址快速查找国家,地区,城市,纬度,经度,邮政编码,时区,ISP,域名,连接类型,I ...

  3. 【GoCN酷Go推荐】快且灵活的JSON解析器-Jsoniter

    一.简介 什么是jsoniter? jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本.从 dsljson 和 jsonparse ...

  4. 「GoCN酷Go推荐」golang 跨平台部署利器

    1 研究背景 go程序部署时,直接将编译好的文件在服务器上运行即可,一般无需安装所依赖的第三方库. Linux下部署分为以下几种方式: 使用nohup 命令 使用 Supervisord管理 使用sy ...

  5. 【GoCN酷Go推荐】Go 系统监控利器-gopsutil

    简介 什么是 gopsutil?要说gopsutil就不得不先了解 psutil,顾名思义,psutil = process and system utilities, 它是 Python 的跨平台库 ...

  6. 【GoCN酷Go推荐】会话控制利器 gorilla/sessions

    推荐 gorilla/sessions 的背景 在日常 Web 应用开发过程中,需要对用户登录状态进行判断,而 HTTP 是无状态的,即不记录用户登录状态,想要得到用户登录状态得把登录状态保存下来,通 ...

  7. 【GoCN酷Go推荐】Go 操作 excel 利器 excelize

    excelize 简介 Excelize是一个用Go语言编写的库,提供了一组允许您写入和读取XLSX / XLSM / XLTM文件的功能.支持读写由Microsoft Excel™2007和更高版本 ...

  8. 「GoCN酷Go推荐」​QQ机器人 go-cqhttp

    什么是 go-cqhttp?✦ QQ机器人,可以做的事儿太多了,比如一个UP主需要群发多个QQ群,以便通知粉丝们开播:再比如可以检测群内或发给自己的消息,而通过代码直接回复做的简单回复.比如检测群内有 ...

  9. 【GoCN酷Go推荐】网络流量抓包库 gopacket介绍

    gopacket简介 1. gopacket是什么? gopacket是google出品的golang三方库,质量还是靠的住,项目地址为:github.com/google/gopacket gopa ...

最新文章

  1. Tempdb数据库详细介绍
  2. linux c 内存操作函数 简介
  3. php在线客服系统源码_在线客服系统物流行业解决方案
  4. 三维建模:方法之CSG与B-Rep比较
  5. JavaEE实战班第16天
  6. 微型计算机出版时间,《微型计算机技术》低价购书_陈慈发 主编_计算机与互联网_孔网...
  7. Intel处理器CPUID指令学习
  8. 精诚合作 共创未来——阿里云数据智能合作策略介绍
  9. 一步步构建大型网站架构(转载)
  10. mysql pxc介绍_MySQL高可用——PXC简介
  11. 【欢聚时代】HR独家传授YY笔试面经小秘诀!
  12. ipad浏览器安装java_在桌面浏览器中调试iphone、ipad等设备上的网页
  13. Java 阿里云图片添加水印
  14. 【SLAM】视觉SLAM:一直在入门,从未到精通
  15. 摄氏度和华氏度的换算
  16. java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程
  17. 我的世界服务器显示弹幕,[娱乐]RaiixDM —— 在mc中接收b站直播弹幕[1.12.x-1.15.x]...
  18. TCP/IP协议栈之LwIP(六)---网络传输管理之TCP协议
  19. 判别分析(Discriminate Analysis)
  20. 【霍尔效应传感器模块与 Arduino】

热门文章

  1. 国家的崛起,无法建立局域网连接
  2. 【Python数据分析】利用Python删除EXCEL表格中指定的列数据或行数据
  3. 项目工时管理遇难题?看看这套工时管理系统解决方案
  4. 清华张长水教授:系统了解图像识别与机器学习
  5. Oracle去重查询实例
  6. 尝试再造python编译器:龙书重制版
  7. 【Leetcode刷题记录_C++】【数据结构】
  8. 利用C++调用天气webservice-gSOAP方法
  9. 使用MongoDB 可视化工具Robomongo(Robo 3T)查看数据
  10. Mac使用bootcamp安装Windows系统后如何设置触控条和触控板