Selenium爬取仅返回首个结果,修改XPath加.后报错如何解决
问题核心原因
- 原始代码循环仅返回第一个结果:不带
.的//开头XPath默认从整个HTML文档根节点全局匹配,无论使用哪个子元素调用find_element,都会返回全页第一个符合条件的元素,因此每次循环拿到的都是第一条数据。 - 加
.后报错:.代表从当前desc元素(即kost-rc__content节点)的子节点开始查找,但你修改后的XPath仍从全页根节点的#app元素开始定位,而desc本身就是#app的后代节点,不可能在desc内部找到#app,因此直接抛出元素不存在的错误。
修正代码
from selenium import webdriver import time driver = webdriver.Chrome(executable_path=r'C:/Users/USER/Downloads/chromedriver_win32/chromedriver.exe') url = 'https://mamikos.com/cari/ugm/all/bulanan/0-15000000' driver.get(url) # 等待页面加载完成,避免偶现找不到元素问题 time.sleep(3) kamar = driver.find_elements_by_class_name('kost-rc__content') for desc in kamar : # 使用相对路径查找当前卡片内的元素,不依赖全局根节点结构 nama = desc.find_element_by_xpath('.//div[contains(@class,"rc__info-name")]/span[1]').text kecamatan = desc.find_element_by_xpath('.//div[contains(@class,"rc__info-name")]/span[2]').text harga = desc.find_element_by_xpath('.//div[contains(@class,"rc__price-bottom")]/span[1]').text print(nama, kecamatan, harga) driver.quit()
优化说明
- 上述代码用
contains()匹配类名的相对路径,完全基于当前卡片内部查找元素,不会出现路径不存在的问题,同时避免了绝对路径依赖页面整体结构、容易失效的问题。 - 如需更高兼容性,可以把固定等待替换为Selenium显式等待逻辑,适配网络波动场景。
内容的提问来源于stack exchange,提问作者Christo Ray
相关产品推荐
相关产品推荐

