DrissionPage 入门教程
简化写法
本教程共 42 篇 · 第 21 篇 · 更新于 2026-07-29 · 约 4 分钟阅读
DrissionPageDrissionPage 入门教程简化写法语法糖快速定位
21. 简化写法
本节目标:掌握 DrissionPage 的简化定位语法,学会把 Tab 对象当函数用,以及各种定位符的简写,写出更简洁的代码。
Tab 对象当作函数
DrissionPage 的页面对象和元素对象都实现了 __call__() 方法。
这意味着你可以像调用函数一样调用它们,效果等同于 ele()。
from DrissionPage import SessionPage
page = SessionPage()
page.get('https://www.baidu.com')
# 原写法
ele = page.ele('#kw')
# 简化写法
ele = page('#kw')
两种写法完全等价,但简化写法更短,链式操作时更清晰。
# 原写法:查找导航栏中的第一个链接
ele = page.ele('#s-top-left').eles('t:a')[0]
# 简化写法
ele = page('#s-top-left')('t:a')[0]
定位符简化
各种定位符都有对应的简写,让语句更短。
| 原写法 | 简化写法 | 说明 |
|---|---|---|
@id | # | id 属性匹配 |
@class | . | class 属性匹配 |
text | tx | 按文本匹配 |
@text() | @tx() | 与 @ 或 @@ 配合时 |
tag | t | 按标签名匹配 |
@tag() | @t() | 与 @ 或 @@ 配合时 |
xpath | x | XPath 方式 |
css | c | CSS Selector 方式 |
# tag 简化为 t
ele = page.ele('tag:div') # 原写法
ele = page('t:div') # 简化写法
# xpath 简化为 x
ele = page.ele('xpath://div[@class="nav"]') # 原写法
ele = page('x://div[@class="nav"]') # 简化写法
# text 简化为 tx
ele = page.ele('text=登录') # 原写法
ele = page('tx=登录') # 简化写法
# css 简化为 c
ele = page.ele('css:.nav') # 原写法
ele = page('c:.nav') # 简化写法
# 和 . 的注意事项
# 和 . 只在语句最前面且单独使用时才生效。
# 正确:# 在最前面
ele = page('#kw')
# 正确:. 在最前面
ele = page('.nav')
# 错误:# 不在最前面时无效
ele = page('@@id=kw@@class=nav') # 这里 # 不会被识别为 id 简写
Shadow Root 简化
获取元素的 shadow root 一般用 ele.shadow_root。
因为这个名字太长,链式操作时影响可读性,所以提供了简写 sr。
# 原写法
txt = ele.shadow_root.ele('t:div').text
# 简化写法
txt = ele.sr('t:div').text
多级 shadow root 链式操作时,简写的好处更明显:
# 多级 shadow root
items = tab('#history-app').sr('#history').sr.eles('t:history-item')
相对定位参数简化
相对定位时,如果只关心第几个元素,不关心类型,可以直接传数字。
# 原写法
ele2 = ele1.next(index=2)
# 简化写法:第一个参数传数字自动识别为 index
ele2 = ele1.next(2)
这个简化适用于所有相对定位方法:
ele2 = ele1.parent(2) # 获取第二层父元素
ele2 = ele1.next(2) # 获取后面第二个兄弟
ele2 = ele1.before(2) # 获取前面第二个元素
ele2 = ele1.child(3) # 获取第三个子节点
什么时候用简化写法
简化写法的优势在链式操作时最明显:
# 原写法,比较长
ele = tab.ele('#nav').ele('.menu').ele('tag:a')
# 简化写法,更紧凑
ele = tab('#nav')('.menu')('t:a')
但简化写法也有缺点:可读性稍差,新手可能看不懂。
建议:
- 简单查找用简化写法
- 复杂定位用完整写法,更清晰
- 团队协作时统一风格
小结
page('xxx')等同于page.ele('xxx')t:替代tag:,x:替代xpath:tx:替代text:,c:替代css:sr替代shadow_root- 相对定位可以直接传数字作为序号
- 简化写法让链式操作更简洁