📖 知识点
1. 三种最高频的 "翻车"
| 报错场景 | 表现 | 常见原因 |
|---|---|---|
| 找不到元素 | ele 返回 None、后续报错 | 选择器写错、元素未加载、在 iframe 里 |
| 超时 | 等待超过 timeout 抛异常 | 网络慢、元素真的不存在 |
| 加载失败 | 页面打不开、取不到 title | 网络、网址错误、被拦截 |
2. 排障三步法
- 看报错信息:先读最后一行报错,多半直接告诉你问题(元素、网络、语法)
- 还原现场:打印
page.title、page.url、len(page.html),确认页面到底加载成什么样 - 对症下药:
- 找不到元素 → 检查选择器、加等待、看是否在 iframe
- 超时 → 加大 timeout、确认元素存在、检查网络
- 加载失败 → 检查网址、网络、有无反爬拦截
3. 用 try/except 兜底(防御性编程)
关键操作包一层,出错不崩溃,提示并继续:
try:
ele = page.ele(".target", timeout=3)
if ele:
print("找到:", ele.text)
else:
print("⚠️ 元素未找到")
except Exception as e:
print("❌ 出错了:", e)
4. 排障常用自查咒语
print("标题:", page.title) # 页面加载成功了吗
print("URL:", page.url) # 是不是跳到别处
print("源码长度:", len(page.html)) # 内容量正常吗
💡 总结
- 报错信息是最准确的线索,先读它
- 用 title/url/html 长度 还原现场
- 用 try/except 兜底,脚本更健壮
⚠️ 易错提醒
- 别一报错就重写,先看 "根因"(选择器?加载?网络?)
- try/except 要捕获具体异常,别一网打尽掩盖真问题
ele(..., timeout=N)可给定位加超时,找不到不再傻等
⚔️ Kata 实战任务
任务需求:
- 导入 ChromiumPage 和 time
- 访问百度
- 故意用一个不存在的选择器,演示找不到元素的情况
- 用 try/except 包裹,捕获异常并打印友好提示
- 再用正确选择器定位,验证排障后能正常找到
参考代码
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get("https://www.baidu.com")
# 魔法排障咒:先还原现场
print("📖 标题:", page.title)
print("🔗 URL:", page.url)
# 场景1:故意用错误选择器,演示排障
try:
bad_ele = page.ele(".不存在的选择器", timeout=3)
if bad_ele:
print("找到元素:", bad_ele.text)
else:
print("⚠️ 元素未找到(返回None),请检查选择器是否正确")
except Exception as e:
print(f"❌ 捕获到异常:{e}")
# 场景2:用正确选择器,排障成功
try:
good_ele = page.ele(".s_ipt", timeout=3)
if good_ele:
print("✅ 排障成功,找到输入框:", good_ele.tag)
else:
print("⚠️ 仍找不到,继续排查")
except Exception as e:
print(f"❌ 异常:{e}")
运行输出(示意):
📖 标题: 百度一下,你就知道
🔗 URL: https://www.baidu.com
⚠️ 元素未找到(返回None),请检查选择器是否正确
✅ 排障成功,找到输入框: input
🧠 思考题
- 看到报错时,第一步应该做什么?为什么说 "报错信息是最准的线索"?
- 用 try/except 包住整个脚本有什么隐患?应该只包住哪些操作?
行者孙Python