Scrapy: пропустить пункт и продолжить с execuion - PullRequest
5 голосов
/ 18 февраля 2011

Я делаю паук RSS. Я хочу продолжить выполнение паук игнорирует текущий узел, если в текущем нет совпадения вещь ... Пока у меня есть это:

        if info.startswith('Foo'):
            item['foo'] = info.split(':')[1]
        else:
            return None

(информация - это строка, которая очищается от xpath до ...)

Но я получаю это исключение:

    exceptions.TypeError: You cannot return an "NoneType" object from a

паук

Так как я могу игнорировать этот узел и продолжить выполнение?

Ответы [ 2 ]

12 голосов
/ 18 февраля 2011
parse(response):
    #make some manipulations
    if info.startswith('Foo'):
            item['foo'] = info.split(':')[1]
            return [item]
        else:
            return []

Но лучше не использовать возврат, использовать yield или ничего не делать

parse(response):
    #make some manipulations
    if info.startswith('Foo'):
            item['foo'] = info.split(':')[1]
            yield item
        else:
            return
1 голос
/ 12 июня 2017

Существует недокументированный метод, который я выяснил, когда мне пришлось пропустить элемент во время синтаксического анализа, но за пределами функции обратного вызова.

Просто повысить StopIteration в любом месте во время синтаксического анализа.

class MySpider(Spider):
    def parse(self, response):
        value1 = parse_something1()
        value2 = parse_something1()
        yield Item(value1, value2)

    def parse_something1(self):
        try:
            return get_some_value()
        except Exception:
            self.skip_item()

    def parse_something2(self):
        if something_wrong:
            self.skip_item()

    def skip_item(self):
        raise StopIteration
...