2016-09-23 108 views
0

类的进口比如我创造了这个类parse()Python的 - 从模块

class PitchforkSpider(scrapy.Spider): 
    name = "pitchfork_reissues" 
    allowed_domains = ["pitchfork.com"] 
    #creates objects for each URL listed here 
    start_urls = [ 
        "http://pitchfork.com/reviews/best/reissues/?page=1", 
        "http://pitchfork.com/reviews/best/reissues/?page=2", 
        "http://pitchfork.com/reviews/best/reissues/?page=3", 
    ] 

    def parse(self, response): 

     for sel in response.xpath('//div[@class="album-artist"]'): 
      item = PitchforkItem() 
      item['artist'] = sel.xpath('//ul[@class="artist-list"]/li/text()').extract() 
      item['reissue'] = sel.xpath('//h2[@class="title"]/text()').extract() 

     return item 

然后我导入module其中class属于:

from blogs.spiders.pitchfork_reissues_feed import * 

,并试图调用parse()在另一上下文:

def reissues(self): 

    pitchfork_reissues = PitchforkSpider() 
    reissues = pitchfork_reissues.parse('response') 
    print (reissues) 

但我得到以下错误:

pitchfork_reissues.parse('response') 
    File "/Users/vitorpatalano/Documents/Code/Soup/Apps/myapp/blogs/blogs/spiders/pitchfork_reissues_feed.py", line 21, in parse 
    for sel in response.xpath('//div[@class="album-artist"]'): 
AttributeError: 'str' object has no attribute 'xpath' 

我错过了什么?

回答

0

你调用parse用于字符串:

reissues = pitchfork_reissues.parse('response') 

我想这应该是一个变量名?像这样:

reissues = pitchfork_reissues.parse(response) 

编辑

蜘蛛的parse方法需要scrapy.http.Response一个实例,因为它是第一个参数,而不是一个字符串包含单词“响应”。

我自己没有使用Scrapy,所以我只知道我在文档中读到的内容,但显然这样的Response实例通常是由'Downloader'创建的。

看起来您正尝试在Scrapy的平常工作流程外调用Spider的parse方法。在这种情况下,我认为你有责任创建这样一个响应,并将它传递给你的Spider时,将其称为parse方法。

+0

给了我下面的回溯:'reissues = pitchfork_reissues.parse(response) NameError:全局名称'response'未定义' –

+2

那么你需要一个scrapy.http.Response实例,它显式地被“下载由下载者)“。参见[文档](http://doc.scrapy.org/en/latest/topics/request-response.html#response-objects):) – Jasper