2017-11-19 2 views
0

나는 스크래핑 스파이더를 가지고 있는데, 스크래피 스파이더는 스크래핑해야하는 페이지에 대한 링크가 포함 된 페이지를 제공합니다. 이제 모든 범주에 제공하지 않고 모든 범주에 대한 링크가 포함 된 페이지를 제공하고 싶습니다. 나는 이것을 얻기 위해 다른 구문 분석 함수를 간단히 추가 할 수 있다고 생각했습니다.재귀 스크 레이 핑 중 속성 오류

하지만 콘솔 출력은 나에게이 some attribute refference가 제대로 작동하지 않는 나에게 말한다 속성 오류

"attributeError: 'zaubersonder' object has no attribute 'parsedetails'"

을 제공합니다. 저는 객체 지향에 익숙하지 않지만 scarpy가 parse_details를 호출하는 prase_level2를 호출하는 parse를 호출한다고 생각합니다.

이하는 지금까지의 노력입니다.

import scrapy 


class zaubersonder(scrapy.Spider): 
    name = 'zaubersonder' 
    allowed_domains = ['abc.de'] 
    start_urls = ['http://www.abc.de/index.php/rgergegregre.html' 
       ] 




    def parse(self, response): 
     urls = response.css('a.ulSubMenu::attr(href)').extract() # links to categories 
     for url in urls: 
      url = response.urljoin(url) 
      yield scrapy.Request(url=url,callback=self.parse_level2) 

    def parse_level2(self, response): 
     urls2 = response.css('a.ulSubMenu::attr(href)').extract() # links to entries 
     for url2 in urls2: 
      url2 = response.urljoin(url2) 
      yield scrapy.Request(url=url2,callback=self.parse_details) 

    def parse_details(self,response): #extract entries 
     yield { 
      "Titel": response.css("li.active.last::text").extract(), 
      "Content": response.css('div.ce_text.first.block').extract() + response.css('div.ce_text.last.block').extract(), 
     } 

편집는 : 코드에서 오타가 그것을

답변

1

를 검색 할 경우 다른 사람의 코드를 수정했습니다. parse_level2의 콜백은 self.parsedetails이지만이 함수의 이름은 parse_details입니다.

yield scrapy.Request(url=url2,callback=self.parse_details) 

을 .. 그리고 더 나은 작동합니다 :

그냥 parse_level2에있는 yield을 변경합니다.

+0

감사합니다. 나는 지금 어리 석다. – Nivatius