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

Python Selenium循环至最后<li>元素及分页爬取失效问题求助

解决你的两个Python Selenium问题

1. 循环定位并操作页面最后一个<li>元素

要循环操作最后一个<li>元素,核心是每次循环都重新定位所有<li>元素(毕竟页面可能动态更新,旧的元素引用很容易失效),然后取列表的最后一项。这里给你两种可靠的实现思路:

方式一:获取所有<li>后取最后一个

这种方法通用性拉满,不管<li>嵌套在哪个父元素下都能用:

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException

driver = webdriver.Chrome()
driver.get("你的目标页面URL")

while True:
    try:
        # 每次循环都重新抓取所有<li>,避免元素引用失效
        li_elements = driver.find_elements_by_tag_name("li")
        if not li_elements:
            break  # 没有<li>元素时直接退出循环
        
        last_li = li_elements[-1]
        # 这里替换成你需要的操作,比如点击、提取文本等
        last_li.click()
        # 加个短等待,给页面更新留时间
        driver.implicitly_wait(2)
        
    except StaleElementReferenceException:
        # 遇到元素失效就重新来一次循环
        continue
    # 记得加自己的退出条件,比如达到循环次数或满足某个业务逻辑后break

方式二:用XPath的last()函数直接定位

如果<li>有明确的父容器,用XPath定位会更精准:

while True:
    try:
        # 把父容器的XPath换成你页面里的实际路径
        last_li = driver.find_element_by_xpath("//ul[@class='your-target-list']/li[last()]")
        last_li.click()
        driver.implicitly_wait(2)
    except NoSuchElementException:
        # 找不到最后一个<li>时退出
        break

2. 修复Shearman人员页面的翻页问题

你的原代码失效,大概率是定位方式不对(li[12]不一定对应下一页按钮),再加上time.sleep这种固定等待太不靠谱。结合页面里下一页按钮是带onclick="PageRequ..."的<a>标签这个特点,给你修正后的方案:

关键改进点:

  • 用显式等待替代time.sleep,确保元素可点击后再操作,避免页面没加载完就点空
  • 直接定位下一页的<a>标签,要么通过按钮文本,要么通过onclick属性的特征

修正后的代码:

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
from selenium.common.exceptions import TimeoutException
import time

driver = webdriver.Chrome()
driver.get("https://www.shearman.com/people")
wait = WebDriverWait(driver, 10)  # 设置最多等待10秒

while True:
    # 先处理当前页的人员资料收集逻辑,这里替换成你自己的代码
    # ...
    
    try:
        # 方式1:如果下一页按钮有"Next"文本,用这个定位更直观
        next_btn = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Next")))
        # 方式2:如果按钮没文本,用onclick属性的特征定位更精准
        # next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@onclick, 'PageRequest')]")))
        
        next_btn.click()
        # 等待页面更新:比如等待搜索结果区域失效,说明新页面在加载
        wait.until(EC.staleness_of(driver.find_element_by_id("searchResultsSection")))
    except TimeoutException:
        # 等待超时,说明已经到最后一页了
        print("已翻到最后一页,结束循环")
        break

driver.quit()

原代码的问题分析:

  1. li[12]的索引是硬编码的,页面结构一变就失效,根本不靠谱
  2. time.sleep(1)时间固定,要是页面加载慢,元素还没出来就点击,肯定失败
  3. 没确保元素处于可点击状态就操作,容易触发各种异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:20:44