2015-11-13 8 views
5

Ich weiß, dies ist eine neue Frage, und es ist eine grundlegende Python-Frage, aber es ist im Rahmen von Scrapy und ich kann die Antwort nirgendwo finden.In einem Scrapy Bot, wie rufe ich eine Funktion aus einer anderen heraus?

Wenn ich diesen Bot Code ausführen:

import scrapy 

from tutorial.items import DmozItem 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["lib-web.org"] 
    start_urls = [ 
     "http://www.lib-web.org/united-states/public-libraries/michigan/" 
    ] 

    count = 0 

    def increment(self): 
     global count 
     count += 1 

    def getCount(self): 
     global count 
     return count 

    def parse(self, response): 
     increment() 
     for sel in response.xpath('//div/div/div/ul/li'): 
      item = DmozItem() 
      item['title'] = sel.xpath('a/text()').extract() 
      item['link'] = sel.xpath('a/@href').extract() 
      item['desc'] = sel.xpath('p/text()').extract() 
      x = getCount() 
      print x 
      yield item 

DmozItem:

import scrapy 

class DmozItem(scrapy.Item): 
    title = scrapy.Field() 
    link = scrapy.Field() 
    desc = scrapy.Field() 

ich diesen Fehler:

File "/Users/Admin/scpy_projs/tutorial/tutorial/spiders/dmoz_spider.py", line 23, in parse 
    increment() 
NameError: global name 'increment' is not defined 

Warum kann ich nicht increment() anrufen aus parse(self, response)? Wie kann ich das schaffen?

Danke für jede Hilfe.

Antwort

6

increment() ist eine Instanz Methode von Ihrem Spider - self.increment() verwenden, um es aufzurufen.

Es ist auch nicht notwendig, Globals zu verwenden - definieren Sie count() als Instanzvariable.

Festgelegte Version:

import scrapy 

from tutorial.items import DmozItem 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["lib-web.org"] 
    start_urls = [ 
     "http://www.lib-web.org/united-states/public-libraries/michigan/" 
    ] 

    def __init__(self, *args, **kwargs): 
     super(DmozSpider, self).__init__(*args, **kwargs) 

     self.count = 0 

    def increment(self): 
     self.count += 1 

    def getCount(self): 
     return self.count 

    def parse(self, response): 
     self.increment() 

     for sel in response.xpath('//div/div/div/ul/li'): 
      item = DmozItem() 
      item['title'] = sel.xpath('a/text()').extract() 
      item['link'] = sel.xpath('a/@href').extract() 
      item['desc'] = sel.xpath('p/text()').extract() 
      x = self.getCount() 
      print x 

      yield item 

Sie können auch define count as a property.

+0

Ich muss auf __init__ und selbst nachlesen. Danke für die Richtung. Es ist was ich brauchte. – ryan71

Verwandte Themen