首页 / DrissionPage 入门教程 / 在元素内查找

DrissionPage 入门教程

在元素内查找

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

DrissionPageDrissionPage 入门教程元素内查找链式查找iframe

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() 获取静态版本,适合纯采集场景