0

私はやろうとしています:

class SpiderSpider(CrawlSpider):
    name = "lolies"
    allowed_domains = ["domain.com"]
    start_urls = ['http://www.domain.com/directory/lol2']
    rules = (Rule(SgmlLinkExtractor(allow=[r'directory/lol2/\w+$']), follow=True), Rule(SgmlLinkExtractor(allow=[r'directory/lol2/\w+/\d+$']), follow=True),Rule(SgmlLinkExtractor(allow=[r'directory/lol2/\d+$']), callback=self.parse_loly))

def parse_loly(self, response):
    print 'Hi this is the loly page %s' % response.url
    return

それは私を返します:

NameError: name 'self' is not defined

コールバックを変更するcallback="self.parse_loly"と、呼び出されないようで、URL が出力されます。

しかし、そのルールに対して多くの Crawled 200 デバッグ メッセージが表示されるため、問題なくサイトをクロールしているようです。

私は何が間違っているのでしょうか?

よろしくお願いします!

4

1 に答える 1

1

の空白がparse_loly正しく配置されていないようです。Python は空白に敏感なので、インタープリターには SpiderSpider の外部のメソッドのように見えます。

PEP8に従って、ルール行を短い行に分割することもできます。

これを試して:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

class SpiderSpider(CrawlSpider):
    name = "lolies"
    allowed_domains = ["domain.com"]
    start_urls = ['http://www.domain.com/directory/lol2/']
    rules = (
        Rule(SgmlLinkExtractor(allow=('\w+$', ))), 
        Rule(SgmlLinkExtractor(allow=('\w+/\d+$', ))),
        Rule(SgmlLinkExtractor(allow=('\d+$',)), callback='parse_loly'),
    )

    def parse_loly(self, response):
        print 'Hi this is the loly page %s' % response.url
        return None
于 2012-08-17T03:20:46.477 に答える