首页 / DrissionPage 入门教程 / SessionPage 元素操作

DrissionPage 入门教程

SessionPage 元素操作

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

DrissionPageDrissionPage 入门教程SessionElement元素定位静态元素相对定位

33. SessionPage 元素操作

本节目标:掌握 SessionPage 的元素定位方法,熟悉 SessionElement 的属性获取,能用相对定位在 DOM 中导航。

SessionPage 获取到的元素是 SessionElement

和 ChromiumElement 不同,它操作的是静态 HTML,没有浏览器 DOM 的实时性。

但定位语法和 API 设计是一致的,学会一个就能用另一个。

定位语法

SessionPage 支持 DrissionPage 的简洁定位语法,也支持 xpath 和 css selector。

from DrissionPage import SessionPage

page = SessionPage()
page.get('https://www.baidu.com')

# id 定位
page.ele('#kw')

# class 定位
page.ele('.s_ipt')

# 属性定位
page.ele('@id=kw')

# 标签定位
page.ele('tag:input')

# 文本定位
page.ele('text:百度一下')

# xpath
page.ele('xpath://input[@id="kw"]')

# css selector
page.ele('css:input#kw')

定位语法在 §12-§16 有详细讲解,这里不重复。

ele() 和 eles()

ele() 返回第一个匹配的元素,找不到返回 NoneElement

eles() 返回所有匹配的元素列表。

# 获取第一个 a 元素
first_link = page.ele('t:a')

# 获取所有 a 元素
all_links = page.eles('t:a')

ele() 支持 index 参数获取第几个:

# 获取第 3 个匹配的元素
third = page.ele('t:a', index=3)

# 倒数第一个
last = page.ele('t:a', index=-1)

SessionElement 属性

基本属性

假设页面里有这个 HTML:

<div id="div1" class="divs">Hello World!
    <p>行元素</p>
    <!--这是注释-->
</div>
ele = page.ele('#div1')

print(ele.tag)          # div
print(ele.html)         # 完整 outerHTML
print(ele.inner_html)   # 内部 HTML
print(ele.text)         # 格式化后的文本
print(ele.raw_text)     # 原始文本

text vs raw_text

text 是格式化后的,去掉了多余空白和换行,适合人看。

raw_text 保留了原始排版,包含空格和换行。

print(ele.text)      # Hello World! 行元素
print(ele.raw_text)  # 包含原始空格和换行

获取属性

# 获取单个属性
ele.attr('id')        # div1

# 获取所有属性(返回 dict)
ele.attrs             # {'id': 'div1', 'class': 'divs'}

# 获取链接(href 或 src)
a_ele.link            # 返回 href 值

attr() 返回完整路径

attr('src')attr('href') 返回的是补全了域名的完整路径。要获取原始值用 attrs['src']

获取文本列表

texts() 返回直接子节点的文本列表:

ele.texts()                    # ['Hello World!', '行元素']
ele.texts(text_node_only=True) # ['Hello World!'] 只返回纯文本节点

获取注释

ele.comments  # ['<!--这是注释-->']

获取路径

print(ele.xpath)     # /html/body/div
print(ele.css_path)  # :nth-child(1)>:nth-child(1)>:nth-child(1)

获取父元素

parent = ele.parent()      # 上一级
parent = ele.parent(2)     # 上两级
parent = ele.parent('@class=container')  # 按条件找祖先

相对定位

SessionElement 支持在 DOM 中上下左右导航。

子节点和兄弟节点

ele.child()            # 第一个直接子节点
ele.children()         # 所有直接子节点
ele.next()             # 后一个同级节点
ele.nexts()            # 后面所有同级节点
ele.prev()             # 前一个同级节点
ele.prevs()            # 前面所有同级节点

文档范围查找

ele.after()            # 后面某一个节点(不限同级)
ele.afters()           # 后面所有节点
ele.before()           # 前面某一个节点
ele.befores()          # 前面所有节点

这些方法都可以传入定位条件筛选:

# 找后面第一个 p 元素
ele.after('t:p')

# 找所有后面的 a 元素
ele.afters('t:a')

ele_only 参数

默认只查找元素节点。设为 False 可以包含文本和注释节点:

ele.child(ele_only=False)   # 包含文本节点

返回值类型

找到元素返回 SessionElement,找到文本返回 str,找不到返回 NoneElement

元素列表批量获取

eles() 返回的列表有 get 属性,可以批量提取信息:

eles = page.eles('t:a')

# 获取所有元素的文本
eles.get.texts()   # ['新闻', 'hao123', '地图', ...]

# 获取所有元素的 href
eles.get.links()   # ['http://news.baidu.com', ...]

# 获取指定属性
eles.get.attrs('href')

在元素内查找

元素对象也有 ele()eles(),在内部继续查找:

container = page.ele('#nav')
links = container.eles('t:a')  # 只在 #nav 内部找

小结

SessionPage 的元素操作和 ChromiumPage 高度一致:

  • 定位语法相同
  • ele() / eles() 用法相同
  • 相对定位 API 相同
  • 主要区别是 SessionElement 操作静态 HTML,没有浏览器 DOM 的实时性

学会一套 API,两种页面对象都能用。这就是 DrissionPage 的设计优势。