选择器概述
在 go-rod
库中,page.Search
方法用于在页面中查找元素,它支持多种类型的选择器来定位元素。以下是常见的选择器类型及其用法:
1. CSS 选择器(最常用)
CSS 选择器是最常见和灵活的选择器类型,可以基于元素的标签名、类名、ID、属性等进行选择。
示例:
按标签名选择:
page.Search("div")
按类名选择:
page.Search(".class-name")
按 ID 选择:
page.Search("#element-id")
按属性选择:
page.Search("[attribute='value']")
组合选择:
page.Search("div.class-name[attr=value]")
2. XPath 选择器
XPath 选择器提供了一种更强大的方式来定位元素,特别适用于处理复杂的文档结构。
示例:
按标签名选择:
page.Search("//div")
按属性选择:
page.Search("//div[@class='class-name']")
按文本内容选择:
page.Search("//*[text()='特定文本']")
组合路径选择:
page.Search("//div[@class='class-name']//span")
3. 文本选择器(text=
)
text=
选择器用于根据元素的文本内容进行选择,是一种简单且直观的方式。
示例:
精确匹配文本:
page.Search("text=复制账号")
部分匹配文本(使用包含关系):
page.Search("text*=账号")
4. 链接文本选择器(link=
)
link=
选择器专门用于根据链接文本进行选择,适用于 <a>
标签。
示例:
精确匹配链接文本:
page.Search("link=登录")
部分匹配链接文本:
page.Search("link*=登")
5. 其他特殊选择器
除了上述常见选择器,go-rod
还支持一些特殊选择器,用于特定场景。
示例:
选择第一个子元素:
page.Search(":first-child")
选择最后一个子元素:
page.Search(":last-child")
选择包含特定类的元素:
page.Search(":has(.class-name)")
总结
选择器类型总结
选择器类型 | 描述 | 示例 |
---|---|---|
CSS 选择器 | 基于标签名、类名、ID、属性等选择元素 | div , .class-name , #id , [attr=value] |
XPath 选择器 | 提供强大而灵活的元素定位方式 | //div , //div[@class='name'] , //*[text()='text'] |
文本选择器 | 根据元素文本内容选择 | text=文本 , text*=部分文本 |
链接文本选择器 | 根据链接文本选择 <a> 标签 | link=链接文本 , link*=部分文本 |
特殊选择器 | 特定场景下的选择器 | :first-child , :last-child , :has(.class) |
选择器使用建议
- 优先使用 CSS 选择器:因其简洁性和广泛支持性,适用于大多数场景。
- 复杂定位使用 XPath:当需要处理嵌套结构或复杂条件时,XPath 提供更多灵活性。
- 文本匹配使用
text=
:对于简单文本匹配场景,text=
选择器直观易用。 - 链接选择使用
link=
:专门针对<a>
标签的链接文本进行选择。
示例代码
以下是一个综合示例,展示不同选择器的使用方法:
package main
import (
"context"
"fmt"
"time"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
)
func main() {
// 禁用无头模式
url := launcher.New().Headless(false).MustLaunch()
// 创建带有超时的上下文
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
// 创建浏览器实例并链接
browser := rod.New().ControlURL(url).Context(ctx).MustConnect()
defer browser.MustClose()
// 创建一个新的页面
page := browser.MustPage("https://example.com").Context(ctx)
// 等待页面加载完成
page.MustWaitLoad()
// 使用不同选择器搜索元素
// CSS 选择器
cssResult, err := page.Search("div.content")
if err != nil {
fmt.Println("CSS 选择器搜索失败:", err)
return
}
fmt.Println("CSS 选择器结果:", cssResult.First().MustText())
// XPath 选择器
xpathResult, err := page.Search("//div[@class='content']")
if err != nil {
fmt.Println("XPath 选择器搜索失败:", err)
return
}
fmt.Println("XPath 选择器结果:", xpathResult.First().MustText())
// 文本选择器
textResult, err := page.Search("text=特定文本")
if err != nil {
fmt.Println("文本选择器搜索失败:", err)
return
}
fmt.Println("文本选择器结果:", textResult.First().MustText())
// 链接文本选择器
linkResult, err := page.Search("link=链接文本")
if err != nil {
fmt.Println("链接文本选择器搜索失败:", err)
return
}
fmt.Println("链接文本选择器结果:", linkResult.First().MustText())
// 延迟退出,便于观察效果
time.Sleep(10 * time.Second)
}
这样可以全面掌握不同类型选择器的使用方法和应用场景。