Golang爬虫全家桶—Goquery选择器

Golang爬虫全家桶—Goquery选择器

goquery类似jquery,它是jquery的go版本实现。使用它,可以很方便的对HTML进行处理。

接本使用

1
2
3
4
dom,err := goquery.NewDocumentFromReader(strings.NewReader(html))
dom.Find("表达式").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

选择器

元素选择器

1
2
3
4
//选择并遍历所有div标签
dom.Find("div").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

直接使用a p div这类标签名就可以表示选中所有标签。

ID/CSS选择器

ID选择器

1
2
3
4
5
6
7
8
9
//选择并遍历所有id为title的标签
dom.Find("#title").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

//选择并遍历所有id为title的div标签
dom.Find("div#title").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

CSS选择器

1
2
3
4
5
6
7
8
9
//选择并遍历所有class为content的标签
dom.Find(".content").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

//选择并遍历所有class为content的p标签
dom.Find("p#content").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

参数选择器

1
2
3
4
5
6
7
8
9
//选择并遍历所有包含class参数的div标签
dom.Find("div[css]").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

//选择并遍历所有class参数为name的div标签
dom.Find("div[css=name]").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
选择器 说明
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]")

子元素选择器

1
2
3
4
5
6
7
8
9
//选择并遍历所有 父元素为body的一级div标签
dom.Find("body>div").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

//选择并遍历所有 父元素为body的div标签
dom.Find("p#content").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

相邻/兄弟选择器

1
2
3
4
//选择并遍历所有 div相邻的下一个p标签
dom.Find("div+p").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})
1
2
3
4
//选择并遍历所有 div相邻的同级p标签
dom.Find("div~p").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Text())
})

过滤器

:first-child过滤器

1
2
3
4
//选择第一个结果
dom.Find("div:first-child").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Html())
})

:first-of-type过滤器

1
2
3
4
//选择第一个同类型结果
dom.Find("div:first-of-type过滤器").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Html())
})

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

与前两个相同,不过是选择最后一个。

:nth-child(n) 过滤器

选择第n个子元素。

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

选择第n个同类型子元素。

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

与前两个相同,不过是选着倒数第n个

:only-child 过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
html := `<body>
<div lang="zh">DIV1</div>
<span>
<div>DIV5</div>
</span>

</body>
`

dom,err:=goquery.NewDocumentFromReader(strings.NewReader(html))
if err!=nil{
log.Fatalln(err)
}

dom.Find("div:only-child").Each(func(i int, selection *goquery.Selection) {
fmt.Println(selection.Html())
})

在这里只有DIV5会被选出来,因为他是他父标签的“独生子”。

:only-of-type 过滤器

只选择同类型的子元素。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×