2015-11-13 34 views
5

我知道这是一个新手问题,它是一个基本的Python问题,但它在Scrapy的上下文中,我无法在任何地方找到答案。在Scrapy bot中,我如何从另一个内部调用一个函数?

当我运行此僵尸代码:

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() 

我得到这个错误:

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

为什么我无法从parse(self, response)内调用increment()?我该如何做这项工作?

感谢您的任何帮助。

回答

6

increment()是一个实例方法你的蜘蛛 - 使用self.increment()来调用它。

此外,没有必要使用全局变量 - 将count()定义为实例变量。

修正版本:

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 

您也可以define count as a property.

+0

我得在__init__和自我阅读起来。感谢您的指导。这是我需要的。 – ryan71

相关问题