Как я могу извлечь идентификатор элемента из ответа в Scrapy? - PullRequest
0 голосов
/ 09 июля 2020
    import scrapy


    class FarmtoolsSpider(scrapy.Spider):
    name = 'farmtools'
    allowed_domains = ['www.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:
            yield {
                'item_id': row.xpath('.//a/@href').get(),
                '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()
                  }

Я хочу извлечь номер элемента из ответа item_id, который является URL-адресом. Можно ли это сделать? Ответ выглядит так:

    {'item_id': 'https://www.donedeal.ie/farmtools-for-sale/international-784- 
    tractor/25283884?campaign=3', 'item_title': 'INTERNATIONAL 784 TRACTOR', 
    'item_county': 'Derry', 'item_price': '3,000'}

Буду признателен за любой совет, спасибо

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Более чистой альтернативой было бы использование regex . Вы даже можете использовать его с селекторами Scrapy ( docs )

'item_title': row.xpath('.//div[1]/p[@class="card__body-title"]/text()').re_first(r'/(\d+)\?campaign')

В приведенном выше фрагменте регулярное выражение вернет строку, содержащую только цифры от / до ?campaign.

В этом конкретном URL https://www.donedeal.ie/farmtools-for-sale/international-784-tractor/25283884?campaign=3 он вернет '25283884'

Отредактировано: Исправлено регулярное выражение

0 голосов
/ 10 июля 2020

Думаю, это сработает. Не чисто, но все же, разделение строки до тех пор, пока вы не получите нужный идентификатор.

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. Подумайте об использовании элементов и загрузчиков элементов.

Элементы: Здесь

Загрузчики элементов: Здесь

Пример загрузчиков элементов: Здесь

...