Scrapy将JSON响应转换为UTF-8编码

8
我已经编写了以下代码来从网站上抓取数据。
import scrapy
from porua_scrapper.items import Category
from porua_scrapper.config import SITE_URL


class CategoriesSpider(scrapy.Spider):
    name = "categories"
    start_urls = []
    for I in range(2):
        url = SITE_URL + "book/categories?page=" + str(I+1)
        start_urls.append(url)

    print(start_urls)


    def parse(self, response):
        # print(response.css('ul.categoryList li div.pFIrstCatCaroItem a').extract_first())

        for category in response.css('ul.categoryList li'):
            categoryObj = Category()

            categoryObj['name'] = category.css('div.bookSubjectCaption h2::text').extract_first()
            categoryObj['url'] = category.css('a::attr(href)').extract_first()

            yield categoryObj

当我运行命令scrapy crawl categories -o categories.json时,它会创建一个categories.json文件,其中包含所需的输出格式。但问题是我的一些内容包含孟加拉文本。因此,在生成的输出文件中,我得到了如下响应:{"url": "/book/category/271/\u09a8\u09be\u099f\u0995", "name": "\u09a8\u09be\u099f\u0995"}。我应该如何将内容编码为utf-8?由于我是新手,我无法根据我的情况找到合适的解决方案。谢谢!
3个回答

22

首先,{"url": "/book/category/271/\u09a8\u09be\u099f\u0995", "name": "\u09a8\u09be\u099f\u0995"}是有效的JSON数据。

>>> import json
>>> d = json.loads('''{"url": "/book/category/271/\u09a8\u09be\u099f\u0995", "name": "\u09a8\u09be\u099f\u0995"}''')
>>> print(d['name'])
নাটক

任何解释此数据的程序都应该可以理解(即解码)这些字符。Python json 模块称之为 ensure_ascii:

如果 ensure_ascii 为真(默认值),则输出中的所有非 ASCII 字符都将使用\uXXXX序列进行转义,结果将是一个仅包含 ASCII 字符的 str 实例。

这就是 Scrapy feed exporter 默认用于 JSON 输出的方式。

但是,如果您需要输出 JSON 文件使用另一种编码,例如 UTF-8,则可以使用 Scrapy 的FEED_EXPORT_ENCODING设置。

FEED_EXPORT_ENCODING = 'utf-8'

5
在settings.py中,添加以下行:FEED_EXPORT_ENCODING = 'utf-8'

可以在爬虫代码中设置这样的选项吗(而不是保留一个settings.py文件)? - undefined

2

要在命令行中运行,请使用选项“--set FEED_EXPORT_ENCODING=utf-8”:

scrapy runspider --set FEED_EXPORT_ENCODING=utf-8 .\TheScrapyScript.py -o TheOutputFile.json

可以在爬虫代码中设置这样的选项吗(而不是保留一个settings.py文件)? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接