Scrapy - фильтрация полученных предметов - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь очистить некоторые элементы, как показано ниже:

def parse(self, response):

    item = GameItem()
    item['game_commentary'] = response.css('tr td:nth-child(2)[style*=vertical-align]::text').extract()
    item['game_movement'] = response.xpath("//tr/td[1][contains(@style,'vertical-align: top')]/text()").extract()

    yield item    

Моя проблема в том, что я не хочу yield всех элементов, которые имеют селекторы response.xpath или response.css экстракты.

Есть ли способ, до назначения этих команд item['game_commentary'] и item['game_movement'], применить regex или что-то еще для фильтрации нежелательных значений, которые не должны быть получены?

1 Ответ

2 голосов
/ 03 мая 2020

Я бы посмотрел на Загрузчики предметов , чтобы выполнить sh это. Вы должны будете переписать свой синтаксический анализ следующим образом:

def parse(self, response):
    loader = GameItemLoader(item=GameItem(), response=response)
    loader.add_css('game_commentary', 'tr td:nth-child(2)[style*=vertical-align]::text')
    loader.add_xpath('game_movement', "//tr/td[1][contains(@style,'vertical-align: top')]/text()")
    item = loader.load_item()
    yield item    

Ваш items.py будет выглядеть примерно так:

from scrapy.item import Item, Field
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst

class GameItemLoader(Item):
    # default input & output processors
    # will be executed for each item loaded,
    # except if a specific in or output processor is specified
    default_output_processor = TakeFirst()

    # you can specify specific input & output processors per field
    game_commentary_in = '...'
    game_commentary_out = '...'

class GameItem(RetviewsItem):
    game_commentary = Field()
    game_movement = Field()

...