Scrapy找不到自定义功能

时间:2019-06-21 10:54:12

标签: python-3.x scrapy

我已经实现了自己的功能,以排除包含某些单词的网址。但是,当我在我的parse方法中调用它时,Scrapy告诉我该函数未定义,即使它已定义。我没有使用规则对象,因为我想从api中获取要删除的Urls。这是我的设置:

class IbmSpiderSpider(scrapy.Spider):
       ...

   def checkUrlForWords(text): 
        ...
        return flag

   def parse(self, response):
        data = json.loads(response.body)
        results = data.get('resultset').get('searchresults').get('searchresultlist')
        for result in results:
            url = result.get('url')
            if (checkUrlForWords(url)==True): continue
        yield scrapy.Request(url, self.parse_content, meta={'title': result.get('title')})

请帮助

3 个答案:

答案 0 :(得分:1)

您的函数在您的类中定义。使用:

IbmSpiderSpider.checkUrlForWords(url)

您的函数看起来像一个静态方法,您可以使用适当的装饰器通过self.checkUrlForWords进行调用:

class IbmSpiderSpider(scrapy.Spider):
       ...

   @staticmethod
   def checkUrlForWords(text): 
        ...
        return flag

   def parse(self, response):
        data = json.loads(response.body)
        results = data.get('resultset').get('searchresults').get('searchresultlist')
        for result in results:
            url = result.get('url')
            if (self.checkUrlForWords(url)==True): continue
        yield scrapy.Request(url, self.parse_content, meta={'title': result.get('title')})

答案 1 :(得分:1)

使用self.checkUrlForWords,因为这是类内部的方法。使用纯checkUrlForWords会导致错误。只需在方法属性和调用中添加self

def checkUrlForWords(self, text): 
        ...
        return flag

答案 2 :(得分:1)

您还可以在类之外的同一个.py文件中定义函数:

def checkUrlForWords(text): 
    ...
    return flag

class IbmSpiderSpider(scrapy.Spider):
       ...
   def parse(self, response):
        data = json.loads(response.body)
        results = data.get('resultset').get('searchresults').get('searchresultlist')
        for result in results:
            url = result.get('url')
            if (checkUrlForWords(url)==True): continue
        ....