不能刮瓷砖; Python字典returns'None'

Can't scrape tile; Python dictionary returns 'None'

我正在尝试从 Indeed.com 中抓取职位名称。

这是我的代码:

import scrapy

class JobsNySpider(scrapy.Spider):
    name = 'jobs_ny'
    allowed_domains = ['www.indeed.com']
    start_urls = ['https://www.indeed.com/jobs?q=analyst&l=New%20York,%20NY&vjk=b588911bd50d7ab1']

    def parse(self, response):
       jobs = response.xpath("//td[@class='resultContent']")
       for job in jobs:
           yield {
            'title': job.xpath(".//h2[@class='jobTitle']/span/text()").get()
           }
    
       next_page=response.urljoin(response.xpath("//ul[@class='pagination-list']/li[position() = last()]/a/@href").get())

       if next_page:
           yield scrapy.Request(url=next_page, callback=self.parse)

出于某种原因,Python 字典 returns {'title': None}。 我禁用了 JavaScript 以确保我正在抓取 HTML 标记。

您的 xpath select 或 title 不正确,因为您使用的是 select 或 @class='jobTitle'h2 元素有多个 classes 在上面所以你的 selector 将找不到匹配的元素。尝试使用 contains 函数,如下所示。

yield {
   'title': job.xpath(".//h2[contains(@class,'jobTitle')]/span/text()").get()
}

或者,如果您想使用 @class=... select,请确保捕获元素上的所有 class。这可能不稳定,因为某些 classes 可能会不时更改。请参阅下面的示例

yield {
   'title': job.xpath(".//h2[@class='jobTitle jobTitle-color-purple']/span/text()").get()
}

我建议使用带有 class 名称的 contains 函数,该名称在您想要 select 的所有元素上都很常见。