| 属性定位 |
page.ele('@name=username') |
通过属性名和属性值定位 |
|
page.ele('@placeholder') |
查找具有该属性的元素 |
| 文本定位 |
page.ele('文本内容') |
查找包含指定文本的元素 |
|
page.ele('text:精确文本') |
查找文本等于指定内容的元素 |
| 多重定位 |
page.ele('tag:div@class=name:text') |
组合多种方式精确定位 |
|
|
|
chrome_path = r'C:\Program Files\Google\Chrome\Application\chrome.exe' # 你的浏览器路径
ChromiumOptions().set_browser_path(chrome_path).save()
| 输入文本 |
.input() |
element.input('文本') |
在输入框内输入文本 |
|
|
|
|
| 获取属性 |
.attr() |
href = element.attr('href') |
获取元素特定属性的值 |
|
|
|
|
| 执行JS |
.run_js() |
page.run_js('alert("Hello");') |
在页面中执行JavaScript代码 |
|
|
|
|
page.run_js('document.querySelector("video").play();')
| 切换标签页 |
.to_tab() |
page.to_tab(1) |
|
|
|
. 模式切换(WebPage 的强大功能)
混合模式 (WebPage) 允许你在浏览器模式和数据包模式之间无缝切换,并共享 Cookie 和 Session 状态。
page = WebPage() # 默认可能是浏览器模式,具体看初始化设置
# 1. 先用浏览器模式登录网站
page.get('https://example.com/login')
page.ele('#username').input('my_username')
page.ele('#password').input('my_password')
page.ele('@type=submit').click()
# 2. 登录成功后,切换到数据包模式(Session模式)进行高效采集
page.change_mode()
# 3. 现在可以使用数据包模式访问需要登录后才能看的页面,Cookie自动携带
page.get('https://example.com/dashboard/data')
items = page.eles('.data-item')
for item in items:
print(item.text)
文本匹配模式语法一览
| 匹配模式 |
符号 |
说明 |
示例(查找元素) |
示例含义 |
| 模糊匹配 |
: |
匹配包含指定字符串的文本或属性 |
page.ele('@text():第二') |
查找文本包含“第二”的元素 |
| 精确匹配 |
= |
匹配完全等于指定字符串的文本或属性 |
page.ele('@text()=第二行') |
查找文本完全等于“第二行”的元素 |
| 匹配开头 |
^ |
匹配开头为指定字符串的文本或属性 |
page.ele('@text()^第二') |
查找文本以“第二”开头的元素 |
| 匹配结尾 |
$ |
匹配结尾为指定字符串的文本或属性 |
page.ele('@text()$行') |
查找文本以“行”结尾的元素 |
| 否定匹配 |
@! |
匹配不包含或不等于指定字符串的文本或属性 |
page.ele('@!class=hidden') |
查找 class 属性不等于"hidden"的元素 |
常用属性的简便写法
为了更简洁,DrissionPage 为一些常用属性提供了简便的写法:
| 属性 |
简便写法 |
等价于 |
示例(查找元素) |
示例含义 |
| id |
# |
@id |
page.ele('#:ne') |
查找 id 属性包含"ne"的元素 |
| class |
. |
@class |
page.ele('.:_cls') |
查找 class 属性包含"_cls"的元素 |
| 文本 |
text: 或直接写 |
@text() |
page.ele('text:第二') |
查找文本包含“第二”的元素( |
查找上级元素(父元素、祖先元素)
可以使用 parent() 方法查找当前元素的父元素或祖先元素。
python
# 假设 current_ele 是某个已经定位到的元素
current_ele = page.ele('text=具体的某行文本')
# 查找直接父元素
parent_ele = current_ele.parent()
# 查找上溯第2级的祖先元素(父元素的父元素)
grand_parent_ele = current_ele.parent(2)
# 使用定位语法在祖先元素中查找符合条件的元素(DrissionPage 特有强大功能)
# 查找上方最近的一个 class 为 'menu' 的祖先元素
ancestor_ele = current_ele.parent('@class=menu')
查找兄弟元素
可以使用 next() 和 prev() 方法查找当前元素的下一个或上一个兄弟元素。
python
# 假设 current_ele 是某个已经定位到的元素
# 查找下一个兄弟元素
next_ele = current_ele.next()
# 查找上一个兄弟元素
prev_ele = current_ele.prev()
# 使用定位语法查找符合条件的下一个兄弟元素
# 查找下一个兄弟元素中 class 为 'active' 的
next_active_ele = current_ele.next('@class=active') # 或者 current_ele.next('.active')
# 查找所有后面的兄弟元素
all_next_eles = current_ele.nexts()
# 查找所有前面的兄弟元素
all_prev_eles = current_ele.prevs()
# 查找所有后面的兄弟元素中标签为 li 的
all_next_lis = current_ele.nexts('tag:li')
| 技巧类别 |
核心技巧/方法 |
作用描述 |
适用模式 |
| 智能等待与控制 |
wait.ele_loaded(), wait.doc_loaded() |
等待元素或文档加载完成,避免操作时元素尚未出现 |
ChromiumPage, WebPage |
|
scroll.to_bottom() |
滚动页面到底部,触发动态加载内容 |
ChromiumPage, WebPage |
| 浏览器配置与伪装 |
ChromiumOptions().set_headless(True) |
设置无头模式(不显示浏览器界面) |
ChromiumPage |
|
set_user_agent(), set_proxy() |
设置用户代理和代理服务器,增强隐蔽性 |
ChromiumPage, SessionPage |
|
set_argument('--disable-blink-features=AutomationControlled') |
|
|