Scrapy: Как заменить бесполезные значения на другие предметы из словаря - PullRequest
0 голосов
/ 03 апреля 2020

Я в настоящее время снимаю цены с веб-сайта, большинство продуктов имеют максимальные и минимальные цены, но не все из них имеют минимальные цены. Те, у кого нет минимума, отбрасывают бесполезные значения, которые я заменял без текста "", но я бы хотел заменить эти пустые значения максимальной ценой (в основном потому, что если цена не меняется, минимальные и максимальные значения совпадают) .

Код обширный, поэтому у меня импортированы следующие библиотеки:

import os
import scrapy
from ..items import TutorialItem
import pandas as pd
from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy.selector import Selector
from scrapy.utils.response import open_in_browser
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

class KikoSpider2(scrapy.Spider):
    name = "kiko2"

    login_page = 'https://www.kikowireless.com/login'
    formdata = {'email': 'thisisan@email.com',
                 'password': 'QQntDXqK9'}

Код продолжается ..

Важная вещь приходит сюда:

def parse_products(self, response):
        items = TutorialItem()
        category = response.meta['category']

        article_name = response.css('#content .name a::text').extract()
        article_price = [ x.replace('$', '').replace('\n', '').replace('\t', '').replace(' ', '') for x in response.css('.price::text').extract()]
        article_price_min = [x.replace('\t', '').replace(
        '$', '').replace('\n', 'n').split()[-1].replace('n', '') for x in response.css('.discount::text').extract()] 

        items['article_name'] = article_name
        items['article_price'] = article_price
        items['article_price_min'] = article_price_min
        for item in zip(article_name, article_price, article_price_min):
            scraped_info = {'supplier_url' : item[0],
                                'supplier_item_name' : item[1],
                                'max_price' : item[2],
                                'min_price' : item[3],
                                  }
                # print(scraped_info)
            df_result = pd.DataFrame.from_dict(scraped_info.items())
            print(df_result)
            yield scraped_info

строка кода article_price = [ x.replace('$', '').replace('\n', '').replace('\t', '').replace(' ', '') for x in response.css('.price::text').extract()] Извлекает минимальную цену статей, что я могу сделать, чтобы заполнить пробелы в ней article_price, соответствующей тому же базовому элементу.

1 Ответ

0 голосов
/ 03 апреля 2020

Это довольно просто.

#this if checks if the value is not null or empty
if article_price_min:
  items['article_price_min'] = article_price_min
else:
  items['article_price_min'] = article_price
...