在元素内查找
本教程共 42 篇 · 第 17 篇 · 更新于 2026-07-29 · 约 5 分钟阅读
17. 在元素内查找
本节目标:学会在已找到的元素内部继续查找子元素,理解页面对象和元素对象都能调用 ele() 的方法,掌握链式查找和 iframe 获取。
页面和元素都能查找
DrissionPage 里,ele() 和 eles() 不只有页面对象能调用。
元素对象也有这两个方法,可以在它内部继续查找子元素。
from DrissionPage import SessionPage
page = SessionPage()
page.get('https://www.baidu.com')
# 在页面内查找元素
nav = page.ele('#s-top-left')
# 在 nav 内部查找所有 a 标签
links = nav.eles('t:a')
for link in links:
print(link.text)
这种”先定位容器,再在容器内找”的模式,在实际工作中非常常见。
ele() 在元素内查找
ele() 返回第一个匹配的子元素。
# 先找到表单
form = page.ele('#login-form')
# 在表单内找用户名输入框
username = form.ele('t:input')
# 在表单内找提交按钮
btn = form.ele('text:登录')
找不到时返回 NoneElement,用 if 判断即可。
btn = form.ele('text:登录')
if btn:
btn.click()
eles() 在元素内查找
eles() 返回所有匹配的子元素列表。
# 找到表格
table = page.ele('#data-table')
# 获取表格内所有行
rows = table.eles('t:tr')
# 遍历每一行
for row in rows:
cells = row.eles('t:td')
for cell in cells:
print(cell.text, end='\t')
print()
链式查找
因为元素对象也能调用 ele(),所以可以一直链下去。
# 多级链式查找
btn = page.ele('#form').ele('#fieldset').ele('text:提交')
这种写法简洁,但链太长可读性会下降。一般建议不超过三级。
链式查找中,如果中间某个元素找不到,会返回
。继续调用会抛出异常。所以链较长时,最好每步都检查。
用简化写法链式查找
Tab 对象和元素对象都实现了 __call__() 方法,可以当作函数调用。
# 原写法
ele = page.ele('#nav').ele('.menu').ele('t:a')
# 简化写法
ele = page('#nav')('.menu')('t:a')
写起来更短,但可读性见仁见智。
获取 iframe 元素
<iframe> 和 <frame> 也是元素,可以用 ele() 找到。
但更推荐用 get_frame() 方法,IDE 能正确提示后续操作。
# 获取页面中第一个 iframe
iframe = tab.get_frame(1)
# 获取 id 为 myFrame 的 iframe
iframe = tab.get_frame('#myFrame')
# 获取 name 为 content-frame 的 iframe
iframe = tab.get_frame('content-frame')
get_frame() 支持四种定位方式:序号(从 1 开始)、定位符、id 属性、name 属性。
在 iframe 内查找元素
获取到 iframe 对象后,它本身就是一个页面对象,可以直接查找内部元素。
# 获取 iframe
iframe = tab.get_frame('#myFrame')
# 在 iframe 内查找元素
ele = iframe.ele('#inner-button')
ele.click()
DrissionPage 支持跨同域 iframe 查找,不需要切入切出。页面对象可以直接找到 iframe 里的元素。
# 页面对象可以直接查找 iframe 内的元素(同域)
ele = tab.ele('#inner-button')
这一点比 selenium 方便很多。selenium 要先 switch_to.frame(),用完还要 switch_to.default_content()。
获取多个 iframe
get_frames() 可以获取多个符合条件的 iframe。
# 获取所有 iframe
iframes = tab.get_frames()
# 获取所有 class 为 content 的 iframe
iframes = tab.eles('.content')
获取所有 iframe 会很慢,而且浪费资源。非必要不要用无参数的
。
静态元素查找
s_ele() 和 s_eles() 可以获取元素的静态版本,处理速度更快。
# 获取元素的静态副本
s_ele = ele.s_ele()
# 在静态副本中查找子元素
child = s_ele.ele('t:div')
静态元素不能交互(不能点击、输入),但解析速度极快。适合纯数据采集场景。
实际例子
采集一个表格里的数据:
from DrissionPage import SessionPage
page = SessionPage()
page.get('https://example.com/products')
# 找到表格
table = page.ele('#product-table')
# 获取所有行
rows = table.eles('t:tr')
# 遍历采集
for row in rows[1:]: # 跳过表头
cols = row.eles('t:td')
name = cols[0].text
price = cols[1].text
print(f'{name}: {price}')
小结
- 页面对象和元素对象都有
ele()和eles() - 链式查找可以一直
.ele()下去 get_frame()获取 iframe 比ele()更好- 同域 iframe 可以直接跨级查找,无需切入切出
s_ele()获取静态版本,适合纯采集场景