Думаю, это сработает. Не чисто, но все же, разделение строки до тех пор, пока вы не получите нужный идентификатор.
def parse(self, response):
rows = response.xpath('//ul[@class="card-collection"]/li')
for row in rows:
link = row.xpath('.//a/@href').get()
link_split = link.split('/')[-1]
link_id = link_split.split('?')[0]
yield {
'item_id': link_id,
'item_title': row.xpath('.//div[1]/p[@class="card__body
title"]/text()').get(),
'item_county': row.xpath('.//ul[@class="card__body-
keyinfo"]/li[2]/text()').get(),
'item_price':
row.xpath('.//p[@class="card__price"]/span[1]/text()').get()
}
Обновление в ответ на комментарий
Полный пример кода
import scrapy
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['donedeal.ie']
start_urls = ['https://www.donedeal.ie/farmtools/']
def parse(self, response):
rows = response.xpath('//ul[@class="card-collection"]/li')
for row in rows:
link = row.xpath('.//a/@href').get()
link_split = link.split('/')[-1]
link_id = link_split.split('?')[0]
yield {
'item_id':link_id,
'item_title': row.xpath('.//p[@class="card__body-title"]/text()').get(),
'item_county': row.xpath('.//ul[@class="card__body-keyinfo"]/li[2]/text()').get(),
'item_price': row.xpath('.//p[@class="card__price"]/span[1]/text()').get()
}
A обратите внимание: при циклическом переходе по каждой «карточке» вам не нужно указывать div, если вы стремитесь получить селектор с уникальным классом, например card__body-title.
Обратите внимание, что получение словаря один из трех способов получить данные из Scrapy. Подумайте об использовании элементов и загрузчиков элементов.
Элементы: Здесь
Загрузчики элементов: Здесь
Пример загрузчиков элементов: Здесь