我正在使用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'虽然有效,但自我却没有。有人可以解释一下吗?
答案 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'})
我希望这很清楚:>