最近研究Go爬虫相关的知识,使用到goquery这个库比较多,尤其是对爬取到的HTML进行选择和查找匹配的内容时,goquery的选择器使用尤其多,而且还有很多不常用但又很有用的选择器,这里总结下,以供参考。

如果大家以前做过前端开发,对jquery不会陌生,goquery类似jquery,它是jquery的go版本实现。使用它,可以很方便的对HTML进行处理。

基于HTML Element 元素的选择器

apdom.Find("div")

Copy

divbodyspan

ID 选择器

dividid

Copy

Element ID 选择器

id#iddom.Find(#id)Find(#id)
dividdiv1Find(div#div1)
Find(element#id)

Class选择器

classclassIDFind(".class")

Copy

classnamediv

Element Class 选择器

classidFind(element.class)

属性选择器

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

Copy

div[class]divclassdiv

刚刚上面这个示例是采用是否存在某个属性为筛选器,同理,我们可以筛选出属性为某个值的元素。

classnamediv
classhref

除了完全相等,还有其他匹配方式,使用方式类似,这里统一列举下,不再举例

选择器说明
Find(“div[lang]“)筛选含有lang属性的div元素
Find(“div[lang=zh]“)筛选lang属性为zh的div元素
Find(“div[lang!=zh]“)筛选lang属性不等于zh的div元素
Find(“div[lang¦=zh]“)筛选lang属性为zh或者zh-开头的div元素
Find(“div[lang*=zh]“)筛选lang属性包含zh这个字符串的div元素
Find(“div[lang~=zh]“)筛选lang属性包含zh这个单词的div元素,单词以空格分开的
Find(“div[lang$=zh]“)筛选lang属性以zh结尾的div元素,区分大小写
Find(“div[lang^=zh]“)筛选lang属性以zh开头的div元素,区分大小写
Find("div[id][lang=zh]")

parent>child选择器

Find("parent>child")
bodydivDIV1、DIV2、DIV3DIV4body
DIV4bodydiv>

Copy

prev+next相邻选择器

假设我们要筛选的元素没有规律,但是该元素的上一个元素有规律,我们就可以使用这种下一个相邻选择器来进行选择。

P1DIV1Find("div[lang=zh]+p")P
("prev+next")

prev~next选择器

有相邻就有兄弟,兄弟选择器就不一定要求相邻了,只要他们共有一个父元素就可以。

Copy

+~P2P2P1DIV1
("prev~next")+~

内容过滤器

有时候我们使用选择器选择出来后后,希望再过滤一下,这时候就用到过滤器了,过滤器有很多,我们先讲内容过滤器这一种。

Copy

Find(":contains(text)")divDIV2DIV2
Find(":empty")
Find(":has(selector)")contains

Copy

divspan

:first-child过滤器

:first-childFind(":first-child")

Copy

Find("div")div:first-childDIV1DIV4DIV

:first-of-type过滤器

:first-child:first-child:first-of-type

Copy

DIV4P2:first-childDIV5P2:first-of-typeDIV5divP2div

:last-child 和 :last-of-type过滤器

:first-child:first-of-type

:nth-child(n) 过滤器

:first-child:nth-child(1)n
DIV2DIV2body

:nth-of-type(n) 过滤器

:nth-of-type(n):nth-child(n):nth-of-type(1):first-of-type

nth-last-child(n) 和:nth-last-of-type(n) 过滤器

这两个和上面的类似,只不过是倒序开始计算的,最后一个元素被当成了第一个。大家自己测试下看看效果,很明显。

:only-child 过滤器

Find(":only-child")

Copy

DIV5spanDIV1

:only-of-type 过滤器

DIV1Find(":only-of-type")div:only-of-type:only-of-typeDIV1

选择器或(|)运算

divspanFind("selector1, selector2, selectorN")

Copy

小结

goquery 是解析HTML网页必备的利器,在爬虫抓取网页的过程中,灵活的使用goquery不同的选择器,可以让我们的抓取工作事半功倍,大大提升爬虫的效率。

文章转自 http://www.flysnow.org/