Когда я запускаю этот код, очищайте только группы элементов - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в Scrapy, и у меня проблема с тем, чтобы он возвращал больше, чем первая строка. Это код:


        import scrapy

        class FarmtoolsSpider(scrapy.Spider):
        name = 'farmtools'
        allowed_domains = ['www.donedeal.ie']
        start_urls = ['https://www.donedeal.ie/farmtools/']

        def parse(self, response):
            for row in response.xpath('//ul[@class="card-collection"]'):
                yield {
                    'item_title': response.xpath('.//div[1]/p[@class="card__body- 
                      title"]/text()').get(),
                    'item_county': response.xpath('.//ul[@class="card__body- 
                       keyinfo"]/li[2]/text()').get(),
                    'item_price': 
                  response.xpath('.//p[@class="card__price"]/span[1]/text()').get(),
                    'item_id': response.xpath('.//li[@class="card- 
                     item"]/a/@href').get()
                      }


Я бы хотел, чтобы заголовок, графство, цена, идентификатор каждого элемента были в разных строках. На самом деле, если я запускаю этот код, он просто дает мне первую строку. Я пробовал getall, но это дает мне только блоки каждого элемента.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Вот рабочий код, который возвращает 30 строк:

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_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': row.xpath('.//li[@class="card-item"]/a/@href').get()
              }

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

попробуйте row .xpath ('.//) вместо response.xpath

например,

for row in response.xpath('//ul[@class="card-collection"]'):
    yield {'item_title': row.xpath('.//div[1]/p[@class="card__body- 
              title"]/text()').get(), etc...}
...