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

Python嵌套循环未遍历列表全部元素问题排查求助

问题

用Python嵌套循环结合Selenium爬取sahibinden.com房源信息时,无法遍历列表全部元素,换成while循环也没用。一开始以为没拿到所有帖子,后来怀疑是嵌套循环的问题,但找不到具体原因。加了print(e)后得到一堆无符号错误栈,相关代码和错误信息如下:

城市配置代码

city= { "adana": ["aladag"]}

主爬取代码

for j in city:
    for k in city[j]:
        for i in range(0,100,20):
            driver.get("https://www.sahibinden.com/satilik-daire/"+j+"-"+k+"?pagingOffset={0}".format(i))    
            item_titles = driver.find_elements(By.XPATH,'//*[@id="searchResultsTable"]/tbody/tr[*]/td[2]/a[1]')
            for link in item_titles:
                try:
                    link.click()
                    item_title = driver.find_elements(By.XPATH,'//*[@id="classifiedDetail"]/div/div[1]/h1')
                    item_prices = driver.find_elements(By.XPATH,'//*[@id="classifiedDetail"]/div/div[2]/div[2]/h3')
                    item_neighbour = driver.find_elements(By.XPATH,'//*[@id="classifiedDetail"]/div/div[2]/div[2]/h2/a[3]')
                    item_date = driver.find_elements(By.XPATH,'//*[@id="classifiedDetail"]/div/div[2]/div[2]/ul/li[2]/span')
                    item_m = driver.find_elements(By.XPATH,'//*[@id="classifiedDetail"]/div/div[2]/div[2]/ul/li[5]/span')
                    
                    for title in item_title:
                        if title !="":    
                            titles_list.append(title.text)                          
                            
                    for prices in item_prices:
                        if prices !="":
                            prices_list.append(prices.text)                   
                    
                    for neighbour in item_neighbour:
                        if neighbour !="":
                            neighbourhood_list.append(neighbour.text)        
                            
                    for dat in item_date:
                        if dat !="":
                            date_list.append(dat.text)          
                            
                    for m in item_m:
                        if m !="":
                            m_list.append(m.text)
                    driver.execute_script("window.history.go(-1)")
  
                except Exception:
                    pass

错误栈信息

(No symbol) [0x00B637D3]
(No symbol) [0x00AF8B81]
(No symbol) [0x009FB36D]
(No symbol) [0x009FE0FB]
(No symbol) [0x009FDFD0]
(No symbol) [0x009FE250]
(No symbol) [0x00A2F0C9]
(No symbol) [0x00A230ED]
(No symbol) [0x00A4B41C]
(No symbol) [0x00A22B96]
(No symbol) [0x00A4B774]
(No symbol) [0x00A61215]
(No symbol) [0x00A4B216]
(No symbol) [0x00A20D97]
(No symbol) [0x00A2253D]
GetHandleVerifier [0x00DDABF2+2510930]
GetHandleVerifier [0x00E08EC1+2700065]
GetHandleVerifier [0x00E0C86C+2714828]
GetHandleVerifier [0x00C13480+645344]
(No symbol) [0x00B00FD2]
(No symbol) [0x00B06C68]
(No symbol) [0x00B06D4B]
(No symbol) [0x00B10D6B]
BaseThreadInitThunk [0x76D27D69+25]
RtlInitializeExceptionChain [0x77CDBB9B+107]
RtlClearBits [0x77CDBB1F+191]

排查与解决建议

1. 核心问题:元素失效导致循环中断

点击链接返回列表页后,原列表页的DOM已重新渲染,item_titles中的元素会变成失效状态,后续循环操作这些元素时会抛出异常,被except Exception: pass直接吞掉,导致遍历提前终止。

解决方法:提前提取所有房源链接的href属性,再循环打开这些链接,避免操作失效元素:

# 替换原代码中item_titles的循环部分
item_links = [link.get_attribute('href') for link in item_titles]
for url in item_links:
    driver.get(url)
    # 后续爬取逻辑...
    driver.back()  # 用driver.back()替代window.history.go(-1),更稳定

2. 无符号错误栈的处理

这种错误是ChromeDriver底层崩溃日志,通常因为页面未加载完成就操作元素,或者浏览器进程异常。

  • 加显式等待:确保元素加载完成后再操作,避免DOM状态不稳定:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 示例:等待标题元素可见后再获取文本
    item_title = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="classifiedDetail"]/div/div[1]/h1'))
    )
    titles_list.append(item_title.text)
    
  • 不要吞掉所有异常:修改捕获逻辑,打印具体错误信息,方便定位:
    except Exception as e:
        print(f"处理链接{url}时出错: {str(e)}")
        driver.save_screenshot(f"error_{i}_{url.split('/')[-1]}.png")  # 保存截图辅助调试
    

3. 其他可能导致遍历不完整的原因

  • XPATH定位不准确:原XPATH//*[@id="searchResultsTable"]/tbody/tr[*]/td[2]/a[1]可能包含非房源行(如广告、分页栏),导致无效元素混入。改成更精准的定位,比如只匹配房源行:
    //*[@id="searchResultsTable"]/tbody/tr[contains(@class, 'searchResultsItem')]/td[2]/a[1]
    
  • 分页逻辑错误:range(0,100,20)假设网站有5页数据,但实际可能没有这么多页,或者分页参数不是pagingOffset。可以先获取分页总数,再动态生成分页范围,避免请求不存在的页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:05:07