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

使用Selenium/Python爬取公寓信息:无法在新标签页定位元素?

问题解决:Selenium切换标签页后无法定位.phoneNumber元素

核心问题分析

从报错日志和代码来看,导致元素定位失败的关键问题有两个:

  • XPATH表达式语法错误:你在contains(@class,'.phoneNumber')里多余添加了.,class属性值本身不包含该符号,这是混淆了CSS选择器和XPATH的语法规则。
  • 页面等待逻辑不严谨:仅用time.sleep(1)固定休眠,无法适配网络波动或页面渲染延迟的情况,经常会出现元素还未加载完成就执行查找的情况。

修复方案

1. 修正元素定位表达式

替换错误的XPATH,以下两种写法都可以:

  • 正确XPATH://a[contains(@class,'phoneNumber')]
  • 更简洁的CSS选择器:a.phoneNumber

2. 替换固定休眠为显式等待

用Selenium的WebDriverWait替代time.sleep(),确保元素完全加载后再执行定位操作,避免因加载慢导致的查找失败。

3. 增加异常捕获逻辑

针对单个公寓详情页无电话元素的情况做容错处理,避免程序直接崩溃。

修改后的代码片段

# 替换原代码中问题区域的内容:
driver.execute_script(f"window.open('{apartment_link}');")
driver.switch_to.window(driver.window_handles[-1])

try:
    # 等待电话元素加载,最长等待10秒
    phone_link = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "a.phoneNumber"))
    )
    phone_number = re.search(r'\d{10}', phone_link.get_attribute('href')).group()
    print("phone number found!", phone_number, " for: ", name.text)
    writer.writerow([name.text, address.text, rent.text, bedrooms.text, phone_number])
except Exception as e:
    print(f"No phone number found for {name.text} at {address.text}, error: {str(e)}")

driver.close()
driver.switch_to.window(driver.window_handles[0])

额外优化建议

  • 避免使用全局try-except直接continue(比如获取公寓名称的逻辑),建议捕获具体异常(如NoSuchElementException),否则会隐藏其他潜在的代码错误。
  • 分页逻辑中,点击下一页后,建议增加显式等待判断页面URL变化或新列表元素加载,确保页面完全刷新后再重新获取公寓数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:21