最近研究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/