2016-08-23 3 views
-1

Wenn meine Spinne läuft auf einer URL wie this:Warum wiederholen sich einige Werte der Felder in dieser Scrapy-Spinne?

def parse_subandtaxonomy(self, response): 
item = response.meta['item'] 
for sub in response.xpath('//div[@class = "page-content"]/section'): 
    item['Subcategory'] = sub.xpath('h2/text()').extract() 
    for tax in sub.xpath('ul/li/a'): 
     item['Taxonomy'] = tax.xpath('text()').extract() 
     for href in tax.xpath('@href'): 
      # url = response.urljoin(href.extract()) - > this gave me 301 redirects 
      badurl = urljoin('https://211sepa.org/search/', href.extract()) 
      url = badurl.replace('search?', 'search/?area_served=Philadelphia&', 1) # shut off to test multi-page 
      request = scrapy.Request(url, callback=self.parse_listings) 
      request.meta['item'] = item 
      yield item 

Ich erhalte diese Ausgabe, das ist, was ich erwarten:

{"Category": ["Housing"], "Subcategory": ["Affordable Housing"], "Taxonomy": ["Section 8 Vouchers"]} 
{"Category": ["Housing"], "Subcategory": ["Affordable Housing"], "Taxonomy": ["Public Housing"]} 
{"Category": ["Housing"], "Subcategory": ["Affordable Housing"], "Taxonomy": ["Low Income/ Subsidized Rental Housing"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Homeless Shelters"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Homeless Shelter Centralized Intake"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Domestic Violence Shelters"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Runaway/ Youth Shelters"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Cold Weather Shelters/ Warming Centers"]} 
{"Category": ["Housing"], "Subcategory": ["Shelter"], "Taxonomy": ["Homeless Shelter for Pregnant Women"]} 
{"Category": ["Housing"], "Subcategory": ["Stay Housed"], "Taxonomy": ["Rent Payment Assistance"]} 
{"Category": ["Housing"], "Subcategory": ["Stay Housed"], "Taxonomy": ["Mortgage Payment Assistance"]} 
{"Category": ["Housing"], "Subcategory": ["Stay Housed"], "Taxonomy": ["Landlord/ Tenant Mediation"]} 
{"Category": ["Housing"], "Subcategory": ["Stay Housed"], "Taxonomy": ["General Dispute Mediation"]} 
{"Category": ["Housing"], "Subcategory": ["Overcome Homelessness"], "Taxonomy": ["Transitional Housing/ Shelter"]} 
{"Category": ["Housing"], "Subcategory": ["Overcome Homelessness"], "Taxonomy": ["Rental Deposit Assistance"]} 
{"Category": ["Housing"], "Subcategory": ["Overcome Homelessness"], "Taxonomy": ["Permanent Supportive Housing"]} 

aber dann, wenn ich yield item-yield request in der weiterhin auf ändern crawl, hat jeder Artikel {"Category": ["Housing"], "Subcategory": ["Overcome Homelessness"], "Taxonomy": ["Permanent Supportive Housing"] ... other item info ... } anstelle seiner jeweiligen Unterkategorie und Taxonomie. Jedes Element, das ich schließlich von jeder Taxonomie möchte, ist abgekratzt, aber es ist falsch beschriftet, wie oben beschrieben. Irgendeine Idee was ist los?

Antwort

0

Es könnte ein Problem mit Oszilloskopen sein. Sie sollten immer versuchen, Ihr Objekt im größtmöglichen Bereich zu erstellen, um die Datenaufbewahrung zu verhindern, d. H. Wenn das aktuelle kein Feld Taxonomy hat, behält das Objekt Daten aus dem vorherigen Schleifenzyklus bei. Aus diesem Grund sollte der Code nach Möglichkeit in jedem Schleifenzyklus ein neues Objekt erstellen.

Versuchen Sie folgendes:

def parse_subandtaxonomy(self, response): 
    for sub in response.xpath('//div[@class = "page-content"]/section'): 
     subcategory = sub.xpath('h2/text()').extract() 
     subcategory = sub.xpath('h2/text()').extract_first() # this just takes first element which is nicer! 
     for tax in sub.xpath('ul/li/a'): 
      item = response.meta['item'].copy() 
      item['Subcategory'] = subcategory 
      item['Taxonomy'] = tax.xpath('text()').extract() 
      for href in tax.xpath('@href'): 
       # url = response.urljoin(href.extract()) - > this gave me 301 redirects 
       badurl = urljoin('https://211sepa.org/search/', href.extract()) 
       url = badurl.replace('search?', 'search/?area_served=Philadelphia&', 1) # shut off to test multi-page 
       request = scrapy.Request(url, 
             callback=self.parse_listings, 
             meta={'item': item}) # you can put meta here directly 
       yield request 
+0

Dies tat es und macht Sinn, danke. Auch neugierig, warum Sie 'item = response.meta ['item']. Copy()' statt nur 'item = response.meta ['item']' –

+0

@g_raham verwendet, um ein neues, sauberes Objekt für jedes Element zu erstellen Schleifenzyklus, um die Datenspeicherung von vorherigen Schleifenzyklen zu verhindern. Scrapy Item ist so ziemlich ein Python-Wörterbuch und Sie können tatsächlich ein Python-Wörterbuch anstelle von Item verwenden. – Granitosaurus

Verwandte Themen