2017-12-17 4 views
0

Ich verwende den Webcrawler scrapy und lädt die Daten in eine CSV-Datei. Ich benutze Xpath und bin auf ein Problem gestoßen, bei dem ich meine Daten richtig geladen habe, was meiner Meinung nach auf einen Fehler in meiner for-Schleife zurückzuführen ist. Es extrahiert nur den allerersten Titel, Autor und Zitat von jeder Seite, was zu einer dreireihigen CSV-Datei führt. Dies ist das erste Mal, dass ich Python benutze, und ich habe Schwierigkeiten, die enumerate/zip-Funktionen ordnungsgemäß zu implementieren.Python - for-Schleife, die geschaufelte Daten nur Schleifen pro Seite liefert

import scrapy 
class MySpider(scrapy.Spider): 
name = 'test' 
custom_settings = { 
    'FEED_FORMAT': 'csv', 
    'FEED_URI': 'test.csv' 
} 
start_urls = [ 
    'http://quotes.toscrape.com/', 
    'http://quotes.toscrape.com/page/2/', 
    'http://quotes.toscrape.com/page/3/' 
] 
def parse(self, response): 
    titles = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract() 
    authors = response.xpath("//small[contains(@class, 'author')]/text()").extract() 
    quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract() 
    for i, (title, author, quote) in enumerate(zip(titles, authors, quotes)): 
     yield {'index': i, 'title': title, 'author': author, 'quote': quote} 

Antwort

1

Das Problem hierbei ist, dass zip nur die gleiche Anzahl von Elementen wie die Mindestliste als Argument übergeben erzeugt, in diesem Fall titles nur 1 Element enthält, so ist es richtig, dass die für nur einmal durchlaufen.

Wenn Sie möchten, dass gleichen Titel für alle Elemente, sollten Sie nur iterieren authors und quotes:

title = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract_first() 
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract() 
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract() 
for i, (author, quote) in enumerate(zip(authors, quotes)): 
    yield {'index': i, 'title': title, 'author': author, 'quote': quote}