首页 / DrissionPage 入门教程 / 元素定位语法概述

DrissionPage 入门教程

元素定位语法概述

本教程共 42 篇 · 第 12 篇 · 更新于 2026-07-29 · 约 7 分钟阅读

DrissionPageDrissionPage 入门教程元素定位定位语法简洁语法

12. 元素定位语法概述

本节目标:理解 DrissionPage 定位语法的设计理念,掌握基本规则和匹配模式,能读懂和编写简单的定位语句。

定位元素是网页自动化最重要的技能。

DrissionPage 提供了一套自己的简洁语法,同时兼容 xpath 和 css selector。

为什么不推荐右键复制路径

很多新手习惯在开发者工具里右键复制 selector 或 xpath。

这样做有几个问题:

  • 代码冗长,可读性低
  • 动态页面容易导致元素失效
  • 网页稍作改动就失效,容错性低
  • 不能跨 <iframe> 查找元素

所以作者极不建议使用右键复制的路径。

三种属性

DrissionPage 的定位语法基于三种元素属性:

写法说明示例
@tag()标签名<div> 中的 div
@****标签属性id="one" 写作 @id
@text()元素文本<p>第三行</p> 中的 第三行

@tag()@text() 后面的 () 是为了和普通属性区分。

比如 <div text="abc">,如果不加括号会和文本属性混淆。

四种匹配模式

符号模式示例含义
=精确匹配@id=oneid 等于 one
:模糊匹配@id:owid 包含 ow
^匹配开头@id^rowid 以 row 开头
$匹配结尾@id$w1id 以 w1 结尾

注意:tag() 属性只有 = 模式。

三种关系

单属性匹配 @

只有一个条件时,用单个 @

tab.ele('@id=one')        # id 为 one 的元素
tab.ele('@tag()=div')     # 第一个 div 元素
tab.ele('@text()=第一行') # 文本为"第一行"的元素

多属性与关系 @@

多个条件同时满足,每个条件用 @@ 开头:

# class 为 p_cls 且文本为"第三行"
tab.ele('@@class=p_cls@@text()=第三行')

多属性或关系 @|

满足任意一个条件,每个条件用 @| 开头:

# id 为 row1 或 id 为 row2
tab.eles('@|id=row1@|id=row2')

否定匹配 @!

排除某个条件:

# id 不等于 one
tab.ele('@!id=one')

# 没有 class 属性的元素
tab.ele('@!class')

NOTE@@@| 不能混用。一个查询只能是与关系或或关系。

常用快捷语法

为了简洁,DrissionPage 提供了一些快捷写法:

快捷语法等价写法说明
#one@id=one匹配 id
.p_cls@class=p_cls匹配 class
text=第二行@text()=第二行匹配文本
tag:div@tag()=div匹配标签

这些快捷语法只能在语句最前面且单独使用时生效。

tab.ele('#one')           # id 为 one
tab.ele('.p_cls')         # class 为 p_cls
tab.ele('第二行')          # 文本包含"第二行"(默认模糊匹配)
tab.ele('tag:div')        # 第一个 div
tab.ele('text=第二行')    # 文本精确匹配

兼容 xpath 和 css

DrissionPage 完全兼容 xpath 和 css selector:

# css selector
tab.ele('css:.p_cls')
tab.ele('#kw')

# xpath
tab.ele('xpath://div[@id="one"]')

也支持 selenium 原生的 loc 元组:

from DrissionPage.common import By

loc = (By.ID, 'one')
tab.ele(loc)

获取多个元素

ele() 返回第一个匹配的元素。eles() 返回所有匹配的:

# 获取第一个 div
div = tab.ele('tag:div')

# 获取所有 div
divs = tab.eles('tag:div')

# 获取所有 class 为 p_cls 的元素
items = tab.eles('.p_cls')

链式查找

先找到父元素,再在范围内查找子元素:

div1 = tab.ele('#one')
p_list = div1.eles('tag:p')

这种方式效率更高,代码更清晰。

TIP:从下一章开始,我们会详细讲解每种定位方式的具体用法。这里先建立整体印象。