Сканирование нескольких таблиц с использованием Scrapy - PullRequest
0 голосов
/ 22 января 2020

Мне нужны данные из разных таблиц. В этом случае таблицы [0:17] и таблица [18]. Мне не нужен стол [17]. Как решить это в одном Scrapy Spider. Это решение не работает. В настоящее время Scrapy получает данные только из таблиц [0:17], но не из таблицы [18].

def parse(self, response):
    table = response.xpath('*//table')[0:17]
    for tab in table:
        trs = tab.xpath('*//tr')[1:]
        for tr in trs:
            name = tr.xpath('.//td[2]/text()').extract_first()
            price = tr.xpath('.//td[3]/text()').extract_first()
            yield {
                'Name': name,
                'Price': price
            }

def parse_next(self, response):
    table = response.xpath('*//table')[18]
    trs = table.xpath('*//tr')[1:]
    for tr in trs:
        name = tr.xpath('.//td[2]/text()').extract_first()
        price = tr.xpath('.//td[3]/text()').extract_first()
        yield {
            'Name': name,
            'Price': price
        }

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Чтобы избежать TypeError, вы можете сделать одно из следующих решений:

  1. Объединить с элементом списка:
table = response.xpath('*//table')[0:17] + [response.xpath('*//table')[18]]
Используйте append:
table = response.xpath('*//table')[0:17].append(response.xpath('*//table')[18])

Также вы можете заставить работать собственное решение, но это немного грязное решение и переусердствовать. Кстати, вы можете перезвонить своему parse_next() в parse() и отправить имя и цена в виде мета-типа:

yield scrapy.Request(url, callback=parse_next, meta={'Name':name, 'Price':price})

Затем выполните остальную работу в parse_next.

0 голосов
/ 22 января 2020

Ваш список может быть выполнен 2 раза, примерно так:

table = response.xpath('*//table')[0:17]
table = table + table[18]

Если [18] не последний элемент, вы также можете сделать следующее:

table = response.xpath('*//table')[0:17]
table = table + table[18:]

отредактировано:

table = response.xpath('*//table')[0:17]
table_final = table + response.xpath('*//table')[18:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...