不能刮瓷砖; 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 的所有元素上都很常见。
我正在尝试从 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 的所有元素上都很常见。