Scrapy Devolver varios artículos

Soy nuevo en Scrapy y realmente estoy perdido en cómo puedo devolver varios artículos en un bloque.

Básicamente, obtengo una etiqueta HTML que tiene una cita que contiene tags anidadas de texto, nombre del autor y algunas tags sobre esa cita.

El código aquí solo devuelve una cita y eso es todo. No utiliza el bucle para devolver el rest. He estado buscando en la web durante horas y no tengo ninguna esperanza. Aquí está mi código hasta ahora:

Spider.py

import scrapy from scrapy.loader import ItemLoader from first_spider.items import FirstSpiderItem class QuotesSpider(scrapy.Spider): name = 'quotes' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): l = ItemLoader(item = FirstSpiderItem(), response=response) quotes = response.xpath("//*[@class='quote']") for quote in quotes: text = quote.xpath(".//span[@class='text']/text()").extract_first() author = quote.xpath(".//small[@class='author']/text()").extract_first() tags = quote.xpath(".//meta[@class='keywords']/@content").extract_first() # removes quotation marks from the text for c in ['“', '”']: if c in text: text = text.replace(c, "") l.add_value('text', text) l.add_value('author', author) l.add_value('tags', tags) return l.load_item() next_page_path = response.xpath(".//li[@class='next']/a/@href").extract_first() next_page_url = response.urljoin(next_page_path) yield scrapy.Request(next_page_url) 

Items.py

 import scrapy class FirstSpiderItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field() 

Aquí está la página que estoy tratando de raspar:

Enlazar

También estaba buscando una solución para el mismo problema. Y aquí está la solución que he encontrado:

 def parse(self, response): for selector in response.xpath("//*[@class='quote']"): l = ItemLoader(item=FirstSpiderItem(), selector=selector) l.add_xpath('text', './/span[@class="text"]/text()') l.add_xpath('author', '//small[@class="author"]/text()') l.add_xpath('tags', './/meta[@class="keywords"]/@content') yield l.load_item() next_page = response.xpath(".//li[@class='next']/a/@href").extract_first() if next_page is not None: yield response.follow(next_page, callback=self.parse) 

Para eliminar las comillas del texto, puede usar un procesador de salida en items.py .

 from scrapy.loader.processors import MapCompose def replace_quotes(text): for c in ['“', '”']: if c in text: text = text.replace(c, "") return text class FirstSpiderItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field(output_processor=MapCompose(replace_quotes)) 

Por favor, hágamelo saber si fue útil.

Prueba esto. Le dará todos los datos que quería raspar.

 import scrapy class QuotesSpider(scrapy.Spider): name = 'quotes' start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): for quote in response.xpath("//*[@class='quote']"): text = quote.xpath(".//span[@class='text']/text()").extract_first() author = quote.xpath(".//small[@class='author']/text()").extract_first() tags = quote.xpath(".//meta[@class='keywords']/@content").extract_first() yield {"Text":text,"Author":author,"Tags":tags} next_page = response.xpath(".//li[@class='next']/a/@href").extract_first() if next_page: next_page_url = response.urljoin(next_page) yield scrapy.Request(next_page_url)