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()
原代码的问题分析:
li[12]的索引是硬编码的,页面结构一变就失效,根本不靠谱time.sleep(1)时间固定,要是页面加载慢,元素还没出来就点击,肯定失败- 没确保元素处于可点击状态就操作,容易触发各种异常
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

