如何解决来自scrapy的xpath结果不会显示来自html页面的相同结果
在抓取此网站搜索时遇到一些问题:
我正试图从de SimplyHired搜索工作中为美国的Data Engineer提取这些元素:
但是当我尝试使用选择器模块对其中的任何一个使用xpath定位器时,得到的结果和顺序将有所不同。
所有这些输出都不匹配(例如,与xpath作业名称相对应的索引与xpath位置中该位置的索引不同)。
这是我的代码:
from scrapy import Selector
import requests
response = requests.get('https://www.simplyhired.com/search?q=data+engineer&l=united+states&mi=exact&sb=dd&pn=1&job=X1yGOt2Y8QTJm0tYqyptbgV9Pu19ge0GkVZK7Im5WbXm-zUr-QMM-A').content
sel=Selector(text=response)
#job name
sel.xpath('//main[@id="job-list"]/div/article[contains(@class,"SerpJob")]/div/div[@class="jobposting-title-container"]/h2/a/text()').extract()
#company
sel.xpath('//main[@id="job-list"]/div/article/div/h3[@class="jobposting-subtitle"]/span[@class="JobPosting-labelWithIcon jobposting-company"]/text()').extract()
#location
sel.xpath('//main[@id="job-list"]//div/article/div/h3[@class="jobposting-subtitle"]/span[@class="JobPosting-labelWithIcon jobposting-location"]/span/span/text()').extract()
#salary estimates
sel.xpath('//main[@id="job-list"]//div/article/div/div[@class="SerpJob-metaInfo"]//div[@class="SerpJob-metaInfoLeft"]/span/text()[2]').extract()
解决方法
我不确定您是要使用Scrapy还是请求。看起来您想使用请求,但要使用xpath选择器。
对于这样的网站,最好将每个单独的招聘广告视为一张“卡片”。您想使用需要获取数据的XPATH选择器遍历每张卡。
代码示例
card = sel.xpath('//div[@class="SerpJob-jobCard card"]')
for a in card:
title = a.xpath('.//a[@class="card-link"]/text()').get()
company = a.xpath('.//span[@class="JobPosting-labelWithIcon jobposting-company"]/text()').get()
salary = a.xpath('.//span[@class="jobposting-salary"]/text()').get()
location = a.xpath('.//span[@class="jobposting-location"]/text()').get()
解释
您要使用相对的XPATH选择器搜索每张卡。 .//
在card
变量下游的HTML块中搜索。
始终使用get()
代替extract()
。 get()
用于获取一个值并始终返回一个字符串,这就是我们遍历每张卡时想要的。 extract()
提取所有值,如果有多个值,并且XPATH选择器只有一个值,它将把它放到一个列表中,而这通常不是您想要的。 extract()
的歧义性并不理想,如果您希望多个值使用getall()
,这是明确的,只会给您多个值。
其他信息
如果发现您没有以正确的格式获取正确的数据,请始终查看是否将javascript内容添加到了网站。关闭浏览器的javascript刷新页面。在这个特定的网站上,JavaScript不会加载您需要的任何数据,这使得抓取变得更加容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。