博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
goquery 查找html标签,goquery库的使用
阅读量:5108 次
发布时间:2019-06-13

本文共 3714 字,大约阅读时间需要 12 分钟。

简介

goquery为Go语言带来了类似于jQuery的语法和一组特性。它基于Go的net / html包和CSS Selector库cascadia。由于net / html解析器返回节点,而不是功能齐全的DOM树,因此jQuery的有状态操作函数(如height(),css(),detach())已经停止。

此外,因为net / html解析器需要UTF-8编码,所以goquery也是如此:调用者有责任确保源文档提供UTF-8编码的HTML。有关执行此操作的各种选项

安装

go get github.com/PuerkitoBio/goquery

选择器

基于HTML Element 元素的选择器

就是基于a,p等这些HTML的基本元素进行选择。

使用方法 :使用语法为 dom.Find(“p”),匹配文档中所有的p标签。

ID 选择器

ID选择器是我们使用最频繁的,假如我们有2个p元素,其实我们只需要其中的一个,那么我们只需要给这个标记一个唯一的id即可,这样我们就可以使用id选择器,精确定位了。

使用方法 :id选择器以#开头,紧跟着元素id的值,使用语法为

dom.Find("#title") ,匹配文档中所有的 id=title的内容

如果多个标签的ID都是title,我们可以指定某一个标签,如dom.Find(“p#title”)

Class选择器

类选择跟ID选择器一样都是使用很频繁的,我们可以通过类选择器快速筛选到需要的内容。

使用方法 : id选择器以.开头,紧跟着元素class的值,使用语法为dom.Find(".content1"),匹配文档中所有的 id=title的元素。

类选择权器跟ID选择器一样,也可以指定某一个标签dom.Find(“div.content1”)

属性选择器

一个HTML元素都有自己的属性以及属性值,所以我们也可以通过属性和值筛选元素。

使用方法 :我们可以通过元素的属性和属性值来筛选数据,使用语法为dom.Find("p[class=content1],匹配文档中所有的 p标 签的class属性是content1的元素。

当然我们这里以class属性为例,还可以用其他属性,比如href等很多,自定义属性也是可以的。

内置函数

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)循环遍历选择的节点

Each(f func(int, *Selection)) *Selection //遍历

EachWithBreak(f func(int, *Selection) bool) *Selection //可中断遍历

Map(f func(int, *Selection) string) (result []string) //返回字符串数组

3)检测或获取节点属性值

Attr(), RemoveAttr(), SetAttr() //获取,移除,设置属性的值

AddClass(), HasClass(), RemoveClass(), ToggleClass()

Html() //获取该节点的html

Length() //返回该Selection的元素个数

Text() //获取该节点的文本值

4)在文档树之间来回跳转(常用的查找节点方法

Children() //返回selection中各个节点下的孩子节点

Contents() //获取当前节点下的所有节点

Find() //查找获取当前匹配的元素

Next() //下一个元素

Prev() //上一个元素

使用示例:

这里示例是爬取一个电影网站中电影的信息:

网页地址为:http://www.haokongbu.com/dongzuopian/144016.html

c := colly.NewCollector()

c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"

///On every a element which has href attribute call callback

c.OnHTML("body", func(e *colly.HTMLElement) {

dom := e.DOM

//电影海报

poster, _ := dom.Find(".poster").Find("img").Attr("src")

intro := dom.Find(".intro")

//电影名称

movieName := intro.Find("h2").Text()

lis := intro.Find("ul").Find("li")

//电影豆瓣评分

score := lis.Eq(0).Find("font").Text()

//时长

length := lis.Eq(1).Find("span").Text()

//导演

doctor := lis.Eq(2).Find("span").Text()

//年代

time := lis.Eq(3).Find("span").Text()

//地区

country := lis.Eq(4).Find("span").Text()

//类型

category := lis.Eq(5).Find("span").Text()

//语言

language := lis.Eq(6).Find("span").Text()

//编剧

scriptwriter := lis.Eq(7).Find("span").Text()

//影片别名

alias := lis.Eq(8).Find("span").Text()

//上映时间

releaseDate := lis.Eq(10).Find("span").Text()

//主演

actors := lis.Eq(11).Find("span").Text()

//关键字

keyword := lis.Eq(12).Find("span").Text()

baiduyunaddres := dom.Find(".baiduyunaddres").Eq(0)

//下载地址

downloadInfos := make([]DownLoadInfo, 0)

//在线播放地址

onlinePlayUrls := make([]OnlinePlayUrl, 0)

baiduyunaddres.Find("ul").Find("li").Each(func(i int, selection *goquery.Selection) {

way := selection.Find("span").Text()

href, _ := selection.Find("a").Attr("href")

title := selection.Find("a").Text()

if way == "在线" {

if href != "" {

playUrl := "https://www.haokongbu.com" + href

movieUrl := GetPlayUrl(playUrl)

onlinePlayUrls = append(onlinePlayUrls, OnlinePlayUrl{Title: title, MovieUrl: movieUrl})

}

//fmt.Println(playUrl)

} else {

downloadInfos = append(downloadInfos, DownLoadInfo{Way: way, Title: title, Href: href})

}

})

//电影简介

introduction, _ := dom.Find(".movietext").Find(".introduction").Html()

})

c.Visit("http://www.haokongbu.com/dongzuopian/144016.html")

转载地址:http://yrjdv.baihongyu.com/

你可能感兴趣的文章
「ZJOI2019」开关
查看>>
QLabel-标签控件的应用
查看>>
[BZOJ1221/Luogu2223][HNOI2001]软件开发
查看>>
Project Euler刷题记录
查看>>
多线程的使用
查看>>
模式识别---贝叶斯决策
查看>>
在博客园中使用pixijs
查看>>
leetCode-Contains Duplicate
查看>>
linux使用秘钥登录(禁用root密码登录)
查看>>
WPS莫名占用系统大部分资源
查看>>
一些常用的正则表达式
查看>>
前端取后台变量的值的写法?
查看>>
BZOJ 1645: [Usaco2007 Open]City Horizon 城市地平线 扫描线 + 线段树 + 离散化
查看>>
误删表数据恢复
查看>>
【codevs1949】兔兔与蛋蛋的游戏
查看>>
Windows Mobile Developer Resource Kit
查看>>
C语言 · 字符串变换
查看>>
C语言 · 确定元音字母位置
查看>>
任务表 燃尽图
查看>>
Python 列表的切片和连接
查看>>