Selenium Python中find_elements_by_xpath相关if else逻辑失效问题
Selenium薪资字段判断逻辑失效的根因与修正方案
核心逻辑错误点
- 方法返回值误用:
find_elements_by_xpath()返回的是匹配成功的WebElement元素列表,列表本身不存在is_displayed()实例方法,原代码直接对列表调用该方法会触发AttributeError,多数场景下开发者会将这类程序直接抛错、中断运行的现象,误认为是if/else判断没有生效 - 空元素取值风险:当DOM中不存在对应薪资节点时,返回的列表为空,后续直接取列表[0]索引值会触发IndexError,导致循环中断
- 语法格式问题:原代码循环块内的代码没有做统一缩进,Python解释器会直接抛出IndentationError,循环逻辑无法正常运行
可正常运行的修正代码
for each_job in job_list: job_company = each_job.find_elements_by_xpath(".//span[@class='company']")[0] job_location = each_job.find_elements_by_xpath(".//span[@class='location accessible-contrast-color-location']")[0] # 第一步先获取匹配到的全部薪资元素,不直接触发方法调用 matched_salary_nodes = each_job.find_elements_by_xpath(".//div[@class='salaryText']") # 先判断是否匹配到对应DOM节点,再判断节点是否可见 if len(matched_salary_nodes) > 0 and matched_salary_nodes[0].is_displayed(): job_salary = matched_salary_nodes[0].text else: job_salary = "Not Mentioned" job_summary = each_job.find_elements_by_xpath(".//div[@class='summary']")[0]
补充注意事项
- 字段存储建议直接取元素的
.text文本内容,不要直接存储WebElement对象引用,避免页面动态刷新后对象引用失效 - 原代码中存储
job_salary时直接存元素节点的写法不符合爬取数据存储的常规逻辑,提取节点文本才是可持久化的有效数据 - 老版本Selenium的
find_elements_by_*系列方法已逐步弃用,长期维护的代码可替换为each_job.find_elements(By.XPATH, "对应xpath表达式")的标准写法,不影响核心判断逻辑
内容的提问来源于stack exchange,提问作者Nirmal Kumar
相关产品推荐
相关产品推荐

