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

使用Selenium爬取REMAX葡萄牙站房源数据时遭遇NoSuchElementException问题求助

解决Selenium爬取房源时NoSuchElementException的问题

我来帮你拆解下为什么只爬price没问题,其他字段会报错,以及对应的解决办法:

问题根源

1. 元素加载不同步

你当前只在driver.get(url)后等了1秒,但页面上的房源卡片可能还没完全渲染。price作为核心字段可能优先加载完成,而address、Tipo这些字段加载稍慢,导致你遍历row的时候,部分房源的目标元素还没出现在DOM里,自然就找不到了。

2. 部分房源字段缺失

不是所有房源都有完整的信息,有些房源可能没有address、卧室数量这些字段。当你用find_element_by_xpath时,如果目标元素不存在,就会直接抛出异常;而price是每个房源必展示的字段,所以不会触发错误。

3. 定位表达式可能不准确

比如你定位Quartos的XPATH是.//p[@class='icon-bedroom-full'],大概率是错的——icon-bedroom-full一般是图标元素的class,实际卧室数量可能在相邻的文本元素里,你需要检查页面实际的DOM结构。

具体解决方案

1. 先等房源列表完全加载

在获取rows之前,用显式等待确保列表元素都渲染完成,替代不靠谱的time.sleep:

# 等待房源列表加载完成,再获取所有row元素
wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='row results-list ']/div")))
rows = driver.find_elements_by_xpath("//div[@class='row results-list ']/div")

2. 用容错方式处理可选字段

对于可能缺失的字段,改用find_elements_by_xpath(返回元素列表),判断列表是否为空再取值,避免抛出异常:

data = []
for row in rows:
    # 处理必选的price字段
    price = row.find_element_by_xpath(".//p[@class='listing-price']").text.strip()
    
    # 处理address字段(容错)
    address_elems = row.find_elements_by_xpath(".//p[@class='listing-address']")
    address = address_elems[0].text.strip() if address_elems else "无地址信息"
    
    # 处理Tipo字段(容错)
    tipo_elems = row.find_elements_by_xpath(".//p[@class='listing-type']")
    Tipo = tipo_elems[0].text.strip() if tipo_elems else "无房源类型"
    
    # 处理Area字段(容错)
    area_elems = row.find_elements_by_xpath(".//p[@class='listing-area']")
    Area = area_elems[0].text.strip() if area_elems else "无面积信息"
    
    # 修正Quartos的定位(假设实际数量在图标相邻的span里,需根据实际DOM调整)
    quartos_elems = row.find_elements_by_xpath(".//*[contains(@class, 'icon-bedroom-full')]/following-sibling::span")
    Quartos = quartos_elems[0].text.strip() if quartos_elems else "无卧室信息"
    
    # 注意:原代码append的方式错误,要把所有字段放在一个列表里
    data.append([price, address, Tipo, Area, Quartos])

3. 修正Driver初始化代码

你原代码里混淆了Chrome和Firefox的Options,导致配置无效,修正后:

from selenium.webdriver.chrome.options import Options  # 导入Chrome的Options
option = Options()
option.headless = False
PATH = r'C:\DRIVERS\chromedriver.exe'  # 加r避免转义字符问题
driver = webdriver.Chrome(executable_path=PATH, options=option)
wait = WebDriverWait(driver, 10)
driver.get(url)

4. 验证定位表达式准确性

打开浏览器开发者工具(F12),用XPATH搜索功能验证你的定位表达式是否能找到目标元素,比如搜索.//p[@class='listing-address'],看看是否所有房源都能匹配到对应的元素。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:57:31