问题描述
某招聘网页部分结构如下所示
<li>
<div class="sub-li">
<a href="XX.html" ka="index_rcmd_job_1" class="job-info" target="_blank">
<div class="sub-li-top">
<div class="sub-li-info">
<p class="name">中级产品经理</p>
<div class="guide-app-download-icon" data-securityid="KTnLhlaF7FzO9-419_2mmVOX0_nySsTXoq31dIPjDQvlUjL01oyzAWNMRNYLgKGm5cEhOFPLSPfGTrKt1YnDDB6XFzXp" data-bossid="324b062645ff119b0nR73t26EVZR" data-isfriend="false"></div>
</div>
<p class="salary">15-22K</p>
</div>
<p class="job-text">
<span>北京</span><span>3-5年</span><span>本科</span>
<span >B端产品</span>
<span >Axure</span>
</p>
</a>
</li>
我在使用xpath爬取class=job-text后使用items存储每一个职位对应的信息。
# 提取职位名称
names = root.xpath('//a[@class="job-info"]/div[@class="sub-li-top"]/div[@class="sub-li-info"]/p[@class="name"]/text()')
# 提取 p=job-text 里每个 span 的内容
description = root.xpath('//a[@class="job-info"]/p[@class="job-text"]/span/text()')
items = []
for i in range(0, len(names)):
item = {}
item["职位名称"] = names[i]
item["其他描述"] = description[i]
item["薪资情况"] = salary[i]
items.append(item)
self.save_file(items)
但是运行后的结果是
{'职位名称': '中级产品经理', '其他描述': '北京',’薪资情况‘: '15-22K'}
{'职位名称': '硬件研发工程师', '其他描述': '3-5年',’薪资情况‘: '18-25K'}
即一条信息里的其他描述只会显示 ‘北京’,下一条信息的其他描述显示’3-5年’。其他描述信息没有和职位一一对应。
解决办法:
Xpath在爬取其他描述信息时,先不直接爬取span,而是爬取所需标签内容的上一级。在item处再添加span路径加载详细信息。
修改后的代码如下
# 提取职位名称
names = root.xpath('//a[@class="job-info"]/div[@class="sub-li-top"]/div[@class="sub-li-info"]/p[@class="name"]/text()')
# 提取每个职位的其他描述
descriptions = root.xpath('//a[@class="job-info"]/p[@class="job-text"]')
# 提取薪资情况
salary = root.xpath('//a[@class="job-info"]/div[@class="sub-li-top"]/p[@class="salary"]/text()')
items = []
for name, description,salary in zip(names, descriptions,salary):
item = {}
item["职位名称"] = name
item["其他描述"] = ", ".join(description.xpath('./span/text()')) # 合并描述为一个字符串
item["薪资情况"] = salary
items.append(item)
self.save_file(items)
成功解决