change Scraper API to call internal `_parse` method

A Spider class using internal pre-processing can have first dibs
at this and then call a public `parse` method for subclass hooking.
This commit is contained in:
nyov 2014-05-24 20:24:01 +00:00 committed by Eugenio Lacuesta
parent 5577d4d2be
commit b9a58798ee
No known key found for this signature in database
GPG Key ID: DA3EF2D0913E9810
5 changed files with 8 additions and 5 deletions

View File

@ -145,7 +145,7 @@ class Scraper(object):
def call_spider(self, result, request, spider):
result.request = request
dfd = defer_result(result)
callback = request.callback or spider.parse
callback = request.callback or spider._parse
warn_on_generator_with_return_value(spider, callback)
warn_on_generator_with_return_value(spider, request.errback)
dfd.addCallbacks(callback=callback,

View File

@ -80,6 +80,9 @@ class Spider(object_ref):
""" This method is deprecated. """
return Request(url, dont_filter=True)
def _parse(self, response):
return self.parse(response)
def parse(self, response):
raise NotImplementedError('{}.parse callback is not defined'.format(self.__class__.__name__))

View File

@ -74,7 +74,7 @@ class CrawlSpider(Spider):
super(CrawlSpider, self).__init__(*a, **kw)
self._compile_rules()
def parse(self, response):
def _parse(self, response):
return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)
def parse_start_url(self, response):

View File

@ -61,7 +61,7 @@ class XMLFeedSpider(Spider):
for result_item in self.process_results(response, ret):
yield result_item
def parse(self, response):
def _parse(self, response):
if not hasattr(self, 'parse_node'):
raise NotConfigured('You must define parse_node method in order to scrape this XML feed')
@ -128,7 +128,7 @@ class CSVFeedSpider(Spider):
for result_item in self.process_results(response, ret):
yield result_item
def parse(self, response):
def _parse(self, response):
if not hasattr(self, 'parse_row'):
raise NotConfigured('You must define parse_row method in order to scrape this CSV feed')
response = self.adapt_response(response)

View File

@ -142,7 +142,7 @@ class XMLFeedSpiderTest(SpiderTest):
for iterator in ('iternodes', 'xml'):
spider = _XMLSpider('example', iterator=iterator)
output = list(spider.parse(response))
output = list(spider._parse(response))
self.assertEqual(len(output), 2, iterator)
self.assertEqual(output, [
{'loc': [u'http://www.example.com/Special-Offers.html'],