Извлечение 3 уровня глубины продукта. Получение ошибки NameError: имя 'item' не определено - PullRequest
0 голосов
/ 08 мая 2019

Я застрял некоторое время, надеюсь, кто-нибудь поможет мне решить следующее:

Что я пытаюсь сделать: Со следующего веб-сайта https://www.coop.nl/boodschappen Я пытаюсь перейти с

1) Уровень категории:

category_url = response.xpath("//div[contains(@class,'block categories')]//a/@href")

2) Уровень обзора продукта:

product_url = response.xpath("//article[contains(@class,'gi b0_12 b2_06 b4_08 listItem')]//div/a/@href").extract()

3) Уровень детализации продукта:

Извлечение и хранение следующих предметов:

  • Уровень категории: category_name, category_url

  • Уровень обзора продукта: product_url

  • Уровень детализации продукта: product_name, product_description, product_pricesI, product_pricesII

В настоящее время появляется следующая ошибка

line 21, in parse item['category_name']   = category_name 
NameError: name 'item' is not defined

Я использую Scrapy 1.5.2 и Python 3.6.4

Items.py файл

import scrapy

class CoopItem(scrapy.Item):
    category_name = scrapy.Field()
    category_url = scrapy.Field()

    product_name = scrapy.Field()
    product_description = scrapy.Field()
    product_pricesI = scrapy.Field()
    product_pricesII = scrapy.Field()
    product_url = scrapy.Field()

файл coop.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from ..items import CoopItem

class CoopSpider(scrapy.Spider):
    name = 'coop'
    allowed_domains = ['coop.nl']  
    start_urls = [
        'https://www.coop.nl/boodschappen/'
    ]

    def parse(self, response):
        # categories
        #item = CoopItem()
        category_name = response.xpath("//div[contains(@class,'block categories')]//div[contains(@class,'title')]/span/text()")
        category_url = response.xpath("//div[contains(@class,'block categories')]//a/@href")

        #item['category_name']   = category_name
        #item['category_url']    = category_url

        for href in category_url:
            cat_url = href.extract()
            cat_name = category_name.extract()
            yield Request(url = cat_url,
                          callback = self.parse_products, meta= {'category_name':cat_name, 'category_url':cat_url})

    def parse_products(self, response):
        # Product overview page(s)        
        product_url = response.xpath("//article[contains(@class,'gi b0_12 b2_06 b4_08 listItem')]//div/a/@href").extract()

        #NEXT_PAGE_SELECTOR = '.pagination--lister a.next::attr(href)'
            #next_page = response.css(NEXT_PAGE_SELECTOR).extract_first()
        NEXT_PAGE_SELECTOR = response.xpath("//div[contains(@class,'pagination--lister')]//a[contains(@rel,'next')]/@href")
        for href in NEXT_PAGE_SELECTOR:
            next_page_url = href.extract()
            yield scrapy.Request(url=next_page_url, callback=self.parse_products)

        yield Request(url, callback = self.parse_product_items, meta={'category_name': category_name, 'category_url': category_url, 'product_url': product_url})

    def parse_product_items(self, response):
        # Product detail page

        product_name = response.xpath("//h1[contains(@itemprop,'name')]//text()").extract()
        product_description = response.xpath("//dl[contains(@class,'definitionList')]//text()").extract()
        product_pricesI = response.xpath("//div[contains(@class,'primeDetails gi b0_12 b3_12 b3_push_01 m-0')]//ins/text()").extract()
        product_pricesII = response.xpath("//div[contains(@class,'primeDetails gi b0_12 b3_12 b3_push_01 m-0')]//span/text()").extract_first()

        item = CoopItem()
        item['category_name']       = category_name
        item['category_url']        = category_url
        item['product_name']        = product_name
        item['product_description'] = product_description
        item['product_pricesI']     = product_pricesI
        item['product_pricesII']    = product_pricesII
        item['product_url']         = product_url
        yield item

1 Ответ

2 голосов
/ 08 мая 2019
  1. В функции parse вы прокомментировали этот код, поэтому не должно быть этой ошибки.
  2. Вам нужно обновить две другие функции:

Извлечение переменных из мета:

def parse_products(self, response):
    # Product overview page(s)     
    category_name = response.meta['category_name']
    category_url = response.meta['category_url']
    ....

def parse_product_items(self, response):
    # Product detail page
    category_name = response.meta['category_name']
    category_url = response.meta['category_url']
    product_url = response.meta['product_url']
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...