2017-05-03 7 views
0

私はネストしたページを持つWebサイトで練習をしています。私は最も内側のページのコンテンツを掻き集める必要があります。主な解析機能への最も内側のページは、ページを開くだけで、最後のparse関数からアイテムを取得し、メインの解析機能ここPython Scrapyのネストされたページには、最も内側のページのアイテムしか必要ありません。

に繰り越すために多くの解析機能を使用して、私が試したものである

try: 
    import scrapy 
    from urlparse import urljoin 

except ImportError: 
    print "\nERROR IMPORTING THE NESSASARY LIBRARIES\n" 



class CanadaSpider(scrapy.Spider): 
    name = 'CananaSpider' 
    start_urls = ['http://www.canada411.ca'] 


    #PAGE 1 OF THE NESTED WEBSITE GETTING LINK AND JOING WITH THE MAIN LINK AND VISITING THE PAGE 
    def parse(self, response): 
     SET_SELECTOR = '.c411AlphaLinks.c411NoPrint ul li' 
     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      try: 
       momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 

       #PASSING A DICTIONARYAS THE ITEM 
       pre = {} 
       post = scrapy.Request(momo, callback=self.parse_pre1, meta={'item': pre}) 
       yield pre 
      except: 
       pass 

#PAGE 2 OF THE NESTED WEBSITE 


    def parse_pre1(self, response): 

     #RETURNING THE SAME ITEM 
     item = response.meta["item"] 
     SET_SELECTOR = '.clearfix.c411Column.c411Column3 ul li' 

     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 
      pre = scrapy.Request(momo, callback=self.parse_pre1, meta={'page_2': item}) 
      yield pre 

    def parse_info(self, response): 

     #HERE I AM SCRAPING THE DATA 
     item = response.meta["page_2"] 
     name = '.vcard__name' 
     address = '.c411Address.vcard__address' 
     ph = '.vcard.label' 

     item['name'] = response.css(name).extract_first() 
     item['address'] = response.css(address).extract_first() 
     item['phoneno'] = response.css(ph).extract_first() 
     return item 

私は間違って何をしているアイテムを継承していますか?

+0

を意味すると思いますが、少し詳しく説明してくださいすることができ、私は –

+1

がparse_pre1 'であなたのコールバックいけないのpythonに新しいです'関数は' callback = self.parse_pre1'の代わりに 'callback = self.parse_info'を参照するべきです – JkShaw

答えて

2

parseであなたはpostのインスタンスでpreを得、また、あなたがScrapy.Itemクラスではなく、辞書を使用する必要がありますされています。

def parse(self, response): 
     SET_SELECTOR = '.c411AlphaLinks.c411NoPrint ul li' 
     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      try: 
       momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 

       #PASSING A DICTIONARYAS THE ITEM 
       pre = {} # This should be an instance of Scrapy.Item 
       post = scrapy.Request(momo, callback=self.parse_pre1, meta={'item': pre}) 
       yield post 
      except: 
       pass 

そしてparse_pre1に、あなたは再びコールバックparse_pre1として設定され、私はあなたがparse_info

def parse_pre1(self, response): 

    #RETURNING THE SAME ITEM 
    item = response.meta["item"] 
    SET_SELECTOR = '.clearfix.c411Column.c411Column3 ul li' 

    for PHONE in response.css(SET_SELECTOR): 
     selector = 'a ::attr(href)' 
     momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 
     pre = scrapy.Request(momo, callback=self.parse_info, meta={'page_2': item}) 
     yield pre 
関連する問題