如何用Selenium正确爬取页面中深度嵌套的职位元素?
解决职位头衔爬取重复问题的方案
问题根源
你循环中使用的绝对XPATH(//开头)会每次从整个HTML文档的根节点开始搜索,所以不管循环到哪个row,都会返回文档中第一个匹配的头衔元素,导致结果重复。
修正方案:使用相对XPATH
将内部查找的XPATH改为相对路径(以.//开头),这样会限定在当前row元素的子节点范围内搜索:
jobs = [] for row in checked: # 用.//开头,限定在当前row下查找目标span title_element = row.find_element(By.XPATH, './/div/div[2]/div/div[2]/span[2]') jobs.append({ 'info': title_element.text }) print(jobs)
如果想更精准匹配头衔关键词,也可以用条件筛选:
title_element = row.find_element(By.XPATH, './/span[contains(text(), "Analyst") or contains(text(), "Vice President") or contains(text(), "Associate")]')
更简洁的方案:直接定位所有头衔元素
不需要先定位职位卡片再循环,直接用一个XPATH获取所有头衔元素,减少层级操作:
# 等待所有头衔元素加载完成 titles = wait.until( EC.presence_of_all_elements_located( (By.XPATH, '//*[@id="__next"]/main/div/div[2]/div/div/div[2]/div/div[2]/div/div/div[2]/div//div/div[2]/div/div[2]/span[2]') ) ) jobs = [{'info': title.text} for title in titles] print(jobs)
CSS选择器替代方案
即使类名通用,也可以通过元素结构层级定位:
titles = wait.until( EC.presence_of_all_elements_located( (By.CSS_SELECTOR, '#__next main > div > div:nth-child(2) > div > div > div:nth-child(2) > div > div:nth-child(2) > div > div > div:nth-child(2) > div div:nth-child(2) > div:nth-child(2) > span:nth-child(2)') ) ) jobs = [{'info': t.text} for t in titles]
小技巧:可以用浏览器开发者工具(F12)右键目标头衔元素,复制相对XPATH或CSS选择器,避免手动编写复杂路径出错。
内容的提问来源于stack exchange,提问作者hemoglobin
相关产品推荐
相关产品推荐

