You need to enable JavaScript to run this app. Python Selenium网页爬虫:如何切换网站内标签页 解决点击后仍爬取首个标签内容问题
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium网页爬虫:如何切换网站内标签页 解决点击后仍爬取首个标签内容问题

问题根因与可直接落地的修正方案

你遇到的“明明写了点击第二个标签的逻辑,采集到的还是第一个标签URL”的问题,没有什么玄学bug,就是三个开发环节的常见疏漏,对照改完就能正常跑:

  • 标签点击逻辑不可靠:硬编码的XPATH没有加交互等待,经常会因为页面还没加载完就执行点击,实际点击动作根本没触发;而且代码里用的都是Selenium已经标记弃用的旧版定位API,版本兼容很容易出问题
  • 等待条件完全无效:你等待的blockFilter元素在两个标签页下都存在,页面刚加载出来就能找到,根本没法证明“第二个标签已经加载完成”
  • 采集逻辑漏判隐藏元素:这个网站的标签切换是纯前端无刷新模式,所有标签对应的产品DOM在页面首次加载时就全部写入了,非激活的标签只是通过CSS设置display: none做隐藏,DOM节点本身还留在页面上。你不做范围限定就全局匹配目标class的产品链接,会把隐藏的第一个标签页的链接全部抓回来,结果自然不对

修正后可直接运行的代码

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

# 替换为你本地chromedriver的实际存放路径
CHROMEDRIVER_PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(CHROMEDRIVER_PATH)
# 初始化统一的10秒显式等待
wait = WebDriverWait(driver, 10)
TARGET_URL = 'https://www.alza.sk/vypredaj-akcia-zlava/e0.htm'

try:
    driver.get(TARGET_URL)
    # 等第二个标签可点击再执行动作,避免点空
    second_tab = wait.until(
        EC.element_to_be_clickable(
            (By.XPATH, '//ul[@id="tabs"]/li[2]')
        )
    )
    second_tab.click()

    # 等标签的激活状态生效,确认切换真的完成
    wait.until(
        EC.presence_of_element_located(
            (By.XPATH, '//ul[@id="tabs"]/li[2][contains(@class, "active")]')
        )
    )

    # 核心修正:只在当前未隐藏的激活标签容器内采集数据,避开其他隐藏标签的内容
    active_tab = wait.until(
        EC.presence_of_element_located(
            (By.XPATH, '//div[contains(@class, "tab-pane") and not(contains(@style, "display: none"))]')
        )
    )
    # 从激活容器内部找产品链接,而不是全页面全局匹配
    product_link_elements = active_tab.find_elements(
        By.XPATH, './/a[@class="name browsinglink impression-binded"]'
    )

    links = [elem.get_attribute('href') for elem in product_link_elements]
    print(links)
finally:
    driver.quit()

新手避坑提醒

  • 尽量别再用find_element_by_xxx这种旧版定位写法,Selenium4之后这类方法已经停止维护,统一用find_element(By.xxx, "定位表达式")的写法兼容性更好
  • 切换标签页的时候,一定要加“激活状态校验”的等待,别只等某个通用元素存在——很多元素从页面加载初始就存在,根本不能证明你的切换动作成功
  • 采集分组内容的时候,一定要先定位到当前激活的容器节点,再从容器内部查找子元素,不然会把页面上所有同class的隐藏元素全部扒下来
  • 别用time.sleep()硬等,网页加载速度不稳定,硬等要么浪费时间要么等待时长不够,显式等待是最可靠的交互判断方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 16:45:00