我已经实现了自己的功能,以排除包含某些单词的网址。但是,当我在我的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')})
请帮助
答案 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
....