2017-12-19 3 views
0

Ich habe ein Skript in Python Scrapy geschrieben, um einige Elemente aus der Preisvergleich Website zu analysieren. Ich bin nicht zufrieden mit dem Ergebnis, weil Skript alle Ergebnisse in einer Reihe bleiben wie:Scrapy: Wie in mehreren Zeilen für jede Daten ausgegeben werden

price,seller 
"4,4,4,4,4,4,4,4,4,4","Opinie o ewitaldo.pl,Opinie o dobrazielarnia.pl,Opinie o brokulek.pl,Opinie o delikatesyznatury.pl,Opinie o bialastokrotka.pl,Opinie o aleeko.pl,Opinie o aptekamini.pl,Opinie o farmeko24.pl,Opinie o straganzdrowia.pl,Opinie o bdsklep.pl" 

und was ich brauche ist:

price,seller 
4,Opinie o ewitaldo.pl 
4,Opinie o dobrazielarnia.pl 
4,Opinie o brokulek.pl 
4,Opinie o delikatesyznatury.pl 
4,Opinie o bialastokrotka.pl 
4,Opinie o aleeko.pl 
4,Opinie o aptekamini.pl 
4,Opinie o farmeko24.pl 
4,Opinie o straganzdrowia.pl 
4,Opinie o bdsklep.pl 

Hier ist meine Spinne Code:

import scrapy 
from ceneo.items import CeneoItem 


class QuotesSpider(scrapy.Spider): 
    name = "quotes" 

    def start_requests(self): 
     urls = [ 
      'https://www.ceneo.pl/33022301' 
     ] 
     for url in urls: 
      yield scrapy.Request(url=url, callback=self.parse)   

    def parse(self, response): 
     items = CeneoItem() 
     sale_price = response.xpath('(//td[@class="cell-price"] /a/span/span/span[@class="value"]/text())[position() <= 10]').extract() 
     seller = response.xpath('(//tr/td/div/ul/li/a[@class="js_product-offer-link"]/text())[position()<=10]').extract() 
     items['product_sale_price'] = ''.join(sale_price).strip() 
     items['product_seller'] = ''.join(seller).strip() 
     yield {'price': sale_price, 'seller': seller} 

Was sollte geändert werden, um eine nette CSV-Ausgabe zu erhalten?

+0

Sie die sale_price und Verkäuferdaten laufen können dann als eine einzige Liste beizutreten. –

+0

Ich bin total noob, können Sie Beispielcode schreiben? – Bodhistawa

Antwort

1

Sie haben zip() zu einer Gruppe verwenden price mit seller und dann yield jedes Paar einzeln

def parse(self, response): 

    all_prices = response.xpath('(//td[@class="cell-price"] /a/span/span/span[@class="value"]/text())[position() <= 10]').extract() 
    all_sellers = response.xpath('(//tr/td/div/ul/li/a[@class="js_product-offer-link"]/text())[position()<=10]').extract() 

    for price, seller in zip(all_prices, all_sellers): 
     yield {'price': price.strip(), 'seller': seller.strip()} 
+0

BTW: voll funktionsfähiges Beispiel Ich legte Github in Unterordner [Scrapping] (https: // github .com/furas/python-examples/baum/master/__ scraping__) – furas

+0

Kann ich Sie um einen anderen Rat bitten? Ich möchte meiner Ausgabe eine weitere Spalte mit IDs von URLs hinzufügen, die ich analysiere. Ids sind in csv mit URLs gespeichert (ich habe Code geändert, um URLs von csv zu verwenden). – Bodhistawa

+0

Wenn etwas größer dann erstellen Sie eine neue Frage - Sie werden Platz haben, um Code und Fehlermeldung zu setzen, und es wird lesbarer sein. – furas

-1

Sie haben die sale_price- und seller-Werte.

sale_data = [sale_price, seller] 
final_list = [zip(*sale_data)[i] for i in xrange(len(sale_price))] 

Diese final_list wird Ergebnis wie folgt anzeigen.

[(u'2893', u'Opinie o klimasklep.pl'), (u'2999', u'Opinie o wentsystem.com'), (u'3419', u'Opinie o master.sklep.pl'), (u'2893', u'Opinie o elektrozilla.pl'), (u'2895', u'Opinie o mk.net.pl'), (u'2949', u'Opinie o e-master.pl'), (u'2960', u'Opinie o kajt24.pl'), (u'2999', u'Opinie o klimatop.pl'), (u'2999', u'Opinie o fabryka-komfortu.pl'), (u'3041', u'Opinie o pajm.pl')] 
+0

Danke. Wie sollte der Ertrag für final_list aussehen? – Bodhistawa

+0

Ich versuche zurück zu geben und final_list, aber Fehler erscheint FEHLER: Spider muss Request, BaseItem, dict oder None zurückgeben, bekam 'tuple' – Bodhistawa

Verwandte Themen