
本文详解在 scrapy 中针对 northrop grumman 招聘页面,如何编写健壮、可维护的 xpath 表达式来稳定提取职位标题(text)和职位 url(@href),避免依赖脆弱的绝对路径。
本文详解在 scrapy 中针对 northrop grumman 招聘页面,如何编写健壮、可维护的 xpath 表达式来稳定提取职位标题(text)和职位 url(@href),避免依赖脆弱的绝对路径。
在 Scrapy 开发中,面对动态渲染或结构嵌套较深的招聘页面(如 Northrop Grumman Jobs),盲目使用浏览器开发者工具自动生成的绝对 XPath(如 /html/body/div[1]/main/...)极易失效——页面微调、广告位插入或 DOM 重排都会导致抓取中断。正确做法是基于语义化 HTML 结构与稳定 class 属性构建相对 XPath。
观察目标页面源码可知:每条职位信息均包裹在具有 col-sm-9 类的 <div> 中,其内部包含一个 <a> 标签,该标签同时承载职位详情页 URL(href 属性)和职位标题(子节点 <h2> 的文本内容)。因此,推荐使用以下两个简洁、鲁棒的 XPath 表达式:
# ✅ 提取所有职位 URL(相对路径,以 '/' 开头)
job_urls = response.xpath('//div[@class="col-sm-9"]/a/@href').getall()
# ✅ 提取所有职位标题(纯文本)
job_titles = response.xpath('//div[@class="col-sm-9"]/a/h2/text()').getall()? 验证技巧:在 Scrapy Shell 中执行 response.xpath('//div[@class="col-sm-9"]').getall(),确认返回的是预期的职位区块列表(通常为 10–20 个 <div class="col-sm-9">...</div>),再逐层校验子节点结构,避免误选导航栏或页脚相似 class。
若需单次查询同时获取 URL 和标题(例如调试时快速比对),可使用 XPath 的 |(union)操作符合并结果集:
# ⚠️ 注意:返回混合列表,顺序为 href、text、href、text... 需按索引配对处理
mixed_results = response.xpath('//div[@class="col-sm-9"]/a/@href | //div[@class="col-sm-9"]/a/h2/text()').getall()关键注意事项:
- 所有 @href 值均为相对路径(如 /jobs/...),实际使用前需通过 response.urljoin(href) 转为绝对 URL;
- 部分 <h2> 标签内可能存在空白符或换行,建议用 .strip() 清洗:title.strip();
- 若页面启用 JavaScript 动态加载(如滚动分页),需配合 Selenium 或分析 AJAX 接口,XPath 本身无法处理未渲染的 DOM;
- 建议始终搭配 .get()(单值)或 .getall()(多值)显式调用,避免因无匹配项返回 None 导致后续逻辑异常。
综上,抛弃“复制粘贴绝对路径”的惯性思维,转而锚定语义化 class、合理使用相对路径与属性轴(@href)、并辅以数据清洗与容错处理,是构建高稳定性爬虫解析逻辑的核心实践。

















