2016-12-13 2 views
1

Dies ist SpinneCall a Spinnen Methode von Pipeline - Python Scrapy

class TicketsSpider(scrapy.Spider): 

    def __set_last_start_date(self, dateString): 
     #code here 

Diese Pipeline ist

class TicketsPipeline(object): 

    def spider_closed(self, spider): 
     spider.__set_last_start_date(spider.lastAdScrapedDate) 

    @classmethod 
    def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
     return pipeline 

I __set_last_start_date() Funktion von spider_closed() Methode aufrufen wollen. Aber ich erhalte diese Störung

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 149, in maybeDeferred 
    result = f(*args, **kw) 
    File "build/bdist.linux-x86_64/egg/pydispatch/robustapply.py", line 55, in robustApply 
    File "tickets/pipelines.py", line 236, in spider_closed 
    spider.__set_last_start_date(spider.lastAdScrapedDate) 
AttributeError: 'TicketsSpider' object has no attribute '_TicketsPipeline__set_last_start_date' 
2016-12-13 02:49:53 [scrapy] INFO: Dumping Scrapy stats: 

Ich kann Ihnen versichern, dass ich spider.lastAdScrapedDate bekommen kann, aber ich bin nicht in der Lage spider.__set_last_start_date

+0

Sind Sie in der Lage Methode andere Spinne zu nennen? Ist '__set_last_start_date' korrekt definiert? Vielleicht müssen Sie mit einem Debugger –

+0

untersuchen Ich kann "spider.lastAdScrapedDate" bekommen, aber ich bin nicht in der Lage zu nennen 'spider .__ set_last_start_date' – Umair

+0

Ich spreche über Methoden, keine Attribute. Warum würde der Fehler "_TicketsPipeline__set_last_start_date" erwähnen und nicht das "TicketsSpider" -Objekt kein Attribut "__set_last_start_date"? Versuchen Sie mit pdb –

Antwort

3

Namen zu nennen, in einer Klasse mit Doppelstrich führenden privat sein soll.

Jede Kennung des Formulars __spam (zumindest zwei führenden Unterstrichen, höchstens ein Unterstreichungsnachlauf) mit _classname__spam textuell ersetzt, in dem Klassennamen Namen mit Unterstrich der aktuellen Klasse (S) abgestreift.

Weitere Informationen finden Sie unter this.

Option 1. Sie können Ihren Methodennamen umbenennen, nicht den doppelten Unterstrich verwenden.

Option 2. Wenn Sie Ihre Methodennamen behalten möchten, dann rufen Sie es auf diese Weise, aber ich glaube nicht, es ist eine gute Idee:

def close_spider(self, spider): 
     spider._TicketsSpider__set_last_start_date(spider.lastAdScrapedDate) 
+0

Danke @pennyliangliping, ich hatte keine Ahnung, dass Doppel-Unterstrich das getan hat. –

+0

@pennylangliping dachte nie daran: P – Umair

Verwandte Themen