es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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ámetro ensure_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étodo parse_item de la clase crawler de la siguiente manera:

    def parse_item(self, response):
        item = dict()
        item['url'] = response.url.strip()
        item['title'] = response.meta['link_text'].strip()
        # extrayendo el cuerpo básico
        item['body'] = '\n'.join(response.xpath('//text()').extract())
    
        # Use json.dumps() with ensure_ascii=False for proper encoding
        yield json.loads(json.dumps(item, ensure_ascii=False))
    

    Esto ayudará a codificar adecuadamente los datos extraídos al generar archivos JSON sin caracteres no deseados ni redundancias.

Comments are closed.