Rastreador que devuelve resultados rastreados con \n’s, ¿cómo deshacerse de ellos?
La intención de este crawler es devolver todos los textos de una página junto con los enlaces, y estamos tratando de almacenar los datos extraídos en archivos json, pero los archivos json vienen con salidas que contienen redundancias como los \n.
Aquí está el araña de scrapy:
import itemloaders
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class crawler(CrawlSpider):
name = 'spidey'
start_urls = ['https://quotes.toscrape.com/page/']
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True),
)
custom_settings = {
'DEPTH_LIMIT': 1,
'DEPTH_PRIORITY': 1,
}
def parse_item(self, response):
item = dict()
item['url'] = response.url.strip()
item['title'] = response.meta['link_text'].strip()
# extracting basic body
item['body'] = '\n'.join(response.xpath('//text()').extract())
# or better just save whole source
#item['source'] = response.body
yield item
Ejemplo de salida en un archivo json:
{
"url": "https://quotes.toscrape.com/tag/miracles/page/1/",
"title": "miracles",
"body": "Quotes to Scrape\n \n \n \nQuotes to Scrape\n\n \n \n \n \n \n \n \n \"There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\"\n\n by \nAlbert Einstein\n\n\n \n Tags:\n \n \ninspirational\n\n \n \nlife\n\n \n \nlive\n\n \n \nmiracle\n\n \n \nmiracles\n\n \n \n \n \n\n \n \n \n Top Ten tags\n\n \n love\n\n \n \n\n inspirational\n\n \n \n\n life\n\n \n \n\n humor\n\n \n \n\n books\n\n \n \n\n reading\n\n \n \n\n friendship\n\n \n \n\n friends\n\n \n \n\n truth\n\n \n \n\n simile\n\n \n \n\n \n \n \n Quotes by: \nGoodReads.com\n\n \n\n Made with \n❤\n by \nScrapinghub\n\n \n \n \n \n\n "
}
¿Cómo solucionar esto?
davy.ai
Para solucionar el problema de la aparición de \n’s y otras redundancias en los archivos JSON, podemos usar el método
json.dumps()
con el parámetroensure_ascii=False
. Esto ayudará a asegurar que los diferentes caracteres y texto en la página estén codificados adecuadamente en la salida JSON.Podemos modificar la declaración
yield
en el métodoparse_item
de la clasecrawler
de la siguiente manera:Esto ayudará a codificar adecuadamente los datos extraídos al generar archivos JSON sin caracteres no deseados ni redundancias.