如何用Selenium和Python定位无值属性元素?Indeed地址提取
解决Indeed爬取中空class地址div的定位问题
一、优化XPath定位(精准过滤干扰项)
之前用//div[@class=""]返回多余内容,核心是没结合上下文缩小范围。结合Indeed页面的常见结构,试试这些写法:
- 结合职位容器+地址文本特征
假设地址所在的职位卡片有固定class(比如job_seen_beacon),且地址文本包含逗号(如Bergamo, Lombardia),用这个XPath精准筛选://div[contains(@class, "job_seen_beacon")]//div[@class="" and contains(text(), ", ")] - 利用相邻元素关联定位
如果地址div紧邻公司名称div(公司名称class通常是companyName),可以通过兄弟节点定位://div[@class="companyName"]/following-sibling::div[@class=""]
二、CSS选择器方案
针对空class的div,CSS可以用div:not([class]),但同样要结合父容器限制范围:
.job_seen_beacon div:not([class])
如果需要进一步过滤地址文本,Selenium可以先获取元素列表,再通过文本特征筛选:
from selenium.webdriver.common.by import By address_elements = driver.find_elements(By.CSS_SELECTOR, ".job_seen_beacon div:not([class])") for elem in address_elements: addr_text = elem.text.strip() if ", " in addr_text: print(addr_text) break
三、通过父容器遍历子元素(By.TAG_NAME)
如果前面的方法都受限,可以先定位职位卡片,再遍历内部div,通过文本格式判断地址:
job_cards = driver.find_elements(By.CLASS_NAME, "job_seen_beacon") for card in job_cards: # 遍历卡片内所有div all_divs = card.find_elements(By.TAG_NAME, "div") for div in all_divs: text = div.text.strip() # 地址通常包含逗号,且长度符合地区格式 if ", " in text and 5 < len(text) < 50: print(f"提取到地址:{text}") break
为什么之前的方法失效?
//div[2]/div:路径太泛,页面动态加载时元素位置会变化,无法稳定定位。//div[@class=""]:页面中空class的div数量多,没有上下文过滤就会返回大量无关内容。- 绝对路径:Indeed页面结构经常调整,绝对路径会随页面更新失效,属于反模式。
内容的提问来源于stack exchange,提问作者Marco Onnis
相关产品推荐
相关产品推荐

