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
| 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
| dom.Find("#title").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
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
| dom.Find(".content").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
dom.Find("p#content").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
|
参数选择器
1 2 3 4 5 6 7 8 9
| dom.Find("div[css]").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
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
| dom.Find("body>div").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
dom.Find("p#content").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
|
相邻/兄弟选择器
1 2 3 4
| dom.Find("div+p").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) })
|
1 2 3 4
| 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 过滤器
只选择同类型的子元素。