page_source为空的根本原因是未等待DOM渲染完成就过早读取。应使用WebDriverWait配合expected_conditions显式等待关键元素出现,而非盲目sleep;同时需注意反爬检测导致的降级HTML问题。

直接用 driver.page_source 拿到的 HTML 就是 JavaScript 执行完毕、DOM 渲染完成后的最终结构,不需要额外“解析”或“转译”——前提是页面确实加载完了。
为什么 page_source 有时还是空的?
不是 page_source 不可靠,而是你读得太早了。浏览器还在发请求、执行 JS、插入节点,DOM 树还没稳定下来,这时调用 page_source 就会拿到半成品 HTML(比如只有骨架、没数据)。
- 常见错误现象:
page_source里找不到你肉眼可见的元素,或者 class 名对不上、文本为空 - 根本原因:没等目标内容真正出现在 DOM 中就急着读取
- 硬加
time.sleep(3)不靠谱——网速快时浪费时间,慢时又不够 - 正确做法:用显式等待,盯住某个能代表“页面就绪”的元素
怎么等才安全?用 WebDriverWait + expected_conditions
显式等待比 sleep 精准得多,它会轮询 DOM,直到指定条件满足或超时。关键不是“等几秒”,而是“等什么出现”。
- 优先等一个**有业务语义的元素**,比如豆瓣电影列表页的
movie-item类名容器,而不是随便一个div - 常用判断条件:
presence_of_element_located(节点存在)、visibility_of_element_located(节点可见且尺寸 >0)、text_to_be_present_in_element(某文本出现) - 超时时间建议设为 10–15 秒,太短容易误判,太长拖慢整体效率
- 示例:
from selenium.webdriver.support.ui import WebDriverWait<br>from selenium.webdriver.support import expected_conditions as EC<br>from selenium.webdriver.common.by import By<br><br>wait = WebDriverWait(driver, 10)<br>wait.until(EC.presence_of_element_located((By.CLASS_NAME, "list-item")))
page_source 和 driver.execute_script("return document.documentElement.outerHTML") 有啥区别?
绝大多数情况下没区别,但有两个边界场景要注意:
立即学习“前端免费学习笔记(深入)”;
- 如果页面用了 Shadow DOM 或 iframe 嵌套很深,
page_source只返回主文档的 HTML,而execute_script可以手动切到子 frame 再取;不过这种情况极少,先别预设复杂度 -
page_source是 Selenium 自动序列化的结果,已做基础编码处理;execute_script返回的是原始 JS 字符串,若含 Unicode 或特殊字符,可能需要手动 decode - 性能上几乎无差别,
page_source更简洁、更符合直觉,优先用它
Firefox 和 Chrome 无头模式下 page_source 行为一致吗?
行为完全一致——只要驱动版本和浏览器版本匹配,page_source 返回的就是当前渲染树的完整 HTML 字符串,与底层引擎无关。
- 差异只在启动参数写法:
options.add_argument('--headless')(Chrome) vsoptions.add_argument('-headless')(Firefox,注意是单横线) - Firefox 默认启用更多兼容性补丁,对老旧 JS 框架(如 jQuery 1.x)支持略好;Chrome 渲染速度稍快,但两者在
page_source输出上无实质区别 - 别纠结选哪个,选你本地装好、驱动能自动配上的那个就行
真正容易被忽略的点是:有些网站会检测 navigator.webdriver 或 User-Agent 并返回降级 HTML,这时候 page_source 看起来“不对劲”,其实不是等待问题,而是反爬干扰——得加 options.add_argument('--disable-blink-features=AutomationControlled') 和伪造 UA,但这已是另一层问题了。



















