【问题标题】:xpath result from scrapy don't show the same result from a html page来自scrapy的xpath结果不显示来自html页面的相同结果
【发布时间】:2020-08-18 14:48:21
【问题描述】:

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

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()

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

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

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

    附加信息

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

    【讨论】:

    • card = sel.xpath('//div[@class="SerpJob-jobCard card"]')(去掉第二个引号)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多