2017-11-19 7 views
0

Ich habe eine scrapy Spinne, die gut funktioniert, solange ich ihm eine Seite geben, die die Links zu den Seiten enthält, die es kratzen sollte. Nun möchte ich nicht alle Kategorien angeben, sondern die Seite, die Links zu allen Kategorien enthält. Ich dachte, ich könnte einfach eine andere Parse-Funktion hinzufügen, um dies zu erreichen.Attribut Fehler beim rekursiven Scraping mit Scrapy

aber die Ausgabe der Konsole gibt mir ein Attribut Fehler

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

Das sagt mir, dass some attribute refference nicht richtig funktioniert. Ich bin neu in Objektorientierung, aber ich dachte, scarpy ist Parse aufrufen, die prase_level2 aufgerufen wird, die ihrerseits parse_details aufrufen und das sollte gut funktionieren.

unten ist meine Bemühungen so weit.

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(), 
     } 

bearbeiten: fixed den Code für den Fall, jemand

Antwort

1

Es ist ein Tippfehler in dem Code für sie suchen. Der Rückruf in parse_level2 ist self.parsedetails, aber die Funktion heißt parse_details.

einfach die yield in parse_level2 ändern:

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

..und es sollte besser funktionieren.

+0

danke, das war es. Ich fühle mich jetzt albern – Nivatius