You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium和Python点击按钮后抓取网页HTML代码?异常求助

解决Selenium点击标签页后无法稳定获取HTML的问题

问题根源

  1. 隐式等待使用错误:implicitly_wait()只需设置一次就全局生效,重复调用不会改变等待时长,且0.8秒对于动态加载页面来说过短,页面内容还未更新就被获取。
  2. 元素定位不准确:你点击的是<li>元素,但标签页的点击事件通常绑定在内部的<a>标签上,直接点击<li>可能无法触发正确的页面更新。
  3. 未等待页面更新:点击标签页后页面内容是动态渲染的,直接调用driver.page_source会拿到未更新的旧内容。

修正后的代码

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.headless = True
options.binary_location = r'/bin/firefox'

driver = webdriver.Firefox(options=options)
driver.set_window_size(2500, 2500)
driver.get('https://blabla.bla')

# 全局设置基础隐式等待
driver.implicitly_wait(5)

all_htmls = []
tab_count = 3

for i in range(tab_count):
    # 等待目标标签的a标签可点击并执行点击
    tab_a = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, f'//ul[@class="pill-nav-tabs"]/li[{i+1}]/a'))
    )
    tab_a.click()
    
    # 等待当前标签页切换为active状态,确认页面已完成切换
    WebDriverWait(driver, 10).until(
        EC.attribute_contains((By.XPATH, f'//ul[@class="pill-nav-tabs"]/li[{i+1}]'), 'class', 'active')
    )
    
    # 可选:如果页面有核心内容容器,可等待其加载完成(根据实际情况调整)
    # WebDriverWait(driver, 10).until(
    #     EC.presence_of_element_located((By.ID, 'target-content'))
    # )
    
    # 获取更新后的页面源码
    all_htmls.append(driver.page_source)

driver.quit()

# 验证结果
print(f"共收集到{len(all_htmls)}个页面的HTML")

关键改进点

  • 显式等待替代重复隐式等待:针对每个操作设置明确的等待条件,确保元素状态符合预期后再执行下一步,彻底避免页面加载延迟导致的错误。
  • 定位正确的可点击元素:直接点击<a>标签,保证触发标签页切换的核心事件。
  • 等待标签状态切换:通过检查<li>的active类,确认页面已完成标签切换,再获取源码。
  • 循环简化代码:用循环处理3个标签页,避免重复冗余代码,提升可维护性。

内容的提问来源于stack exchange,提问作者asparagus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:57:23