AttributeError:'蜘蛛'对象没有属性' table'

时间:2017-12-23 18:36:57

标签: python oop scrapy

我正在使用scrapy。我有一只以:

开头的蜘蛛
class For_Spider(Spider):

    name = "for"
#    table = 'hello' # creating dummy attribute. will be overwritten

    def start_requests(self):

        self.table = self.dc # dc is passed in

我有以下管道:

class DynamicSQLlitePipeline(object):

    @classmethod
    def from_crawler(cls, crawler):
        # Here, you get whatever value was passed through the "table" parameter
        table = getattr(crawler.spider, "table")
        return cls(table)

    def __init__(self,table):
        try:
            db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
            db = dataset.connect(db_path)
            table_name = table[0:3]  # FIRST 3 LETTERS
            self.my_table = db[table_name]

当我用:

启动蜘蛛
scrapy crawl for -a dc=input_string -a records=1

我明白了:

AttributeError: 'For_Spider' object has no attribute 'table'

如果我取消评论' table' ,程序将开始。我很困惑为什么' table'虽然有效,但自我却没有。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

table将起作用,因为它是For_Spider的类属性,self.table就在函数范围内。 self表示实例本身,因此在该功能内部您不需要使用它(除非您在__init__中定义它。) 如果您尝试在功能范围之外定义self.table,则会收到错误。

另外,尝试在两个类上使用__dict__来查看它们的属性和功能
用表评论:

  

{' doc ':无,' start_requests':,' name':' for' ,' 模块':' builtins'})

如您所见,没有table属性

表没有评论:

  

{' doc ':无,' start_requests':,' table':' hello' ,'名称':' for',' 模块':' builtins'})

我希望这很清楚:>