首页 > 解决方案 > 来自scrapy的xpath结果不显示来自html页面的相同结果

问题描述

我在抓取此网站搜索时遇到了一些问题:

https://www.simplyhired.com/search?q=data+engineer&l=United+States&pn=1&job=ZMzeXt6JW0jMuZc6H-3Af3sqOGzeQMLj7X5mnXXv9ZteeAoGm6oDdg

我正在尝试从美国数据工程师的 de SimplyHired 搜索工作中提取这些元素:

在此处输入图像描述

但是,当我尝试使用选择器模块对其中任何一个使用 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()

标签: pythonweb-scrapingscrapy

解决方案


我不太确定您是在尝试使用 Scrapy 还是 requests。看起来您想使用 requests 但使用 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 选择器搜索每张卡片。在变量.//下游的 HTML 块中的搜索。card

始终使用get()而不是extract(). get()用于获取一个值并始终返回一个字符串,这就是我们在遍历每张卡片时想要的。extract()如果有多个值,并且如果 XPATH 选择器只有一个值,则提取所有值,它会将其放入一个通常不是您想要的列表中。的歧义extract()并不理想,如果您想使用多个值getall(),这是明确的,只会给您多个值。

附加信息

如果您发现您没有以正确的格式获得正确的数据,请始终查看是否将 javascript 内容添加到网站。关闭浏览器 javascript 以刷新页面。在这个特定的站点上,您需要的所有数据都不是由 javascript 加载的,这使得抓取变得更加容易。


推荐阅读