SessionPage 元素操作
本教程共 42 篇 · 第 33 篇 · 更新于 2026-07-29 · 约 7 分钟阅读
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 的设计优势。