Scrapy:跳过项目并继续执行

时间:2011-02-18 10:23:10

标签: python web-crawler scrapy

我在做一个RSS蜘蛛。我想继续执行 如果当前没有匹配,则spider忽略当前节点 项目...到目前为止,我有这个:

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

(info是一个字符串,在...之前从xpath清理过来。)

但我得到了这个例外:

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

蜘蛛

那么如何忽略此节点并继续执行?

2 个答案:

答案 0 :(得分:12)

parse(response):
    #make some manipulations
    if info.startswith('Foo'):
            item['foo'] = info.split(':')[1]
            return [item]
        else:
            return []

但最好不要使用return,使用yield或不做任何事情

parse(response):
    #make some manipulations
    if info.startswith('Foo'):
            item['foo'] = info.split(':')[1]
            yield item
        else:
            return

答案 1 :(得分:1)

当我在解析期间不得不跳过项目但在回调函数之外时,我发现了一个未记录的方法。

在解析过程中,只需将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