2017-01-04 79 views
2

我已经写了下面的代码来从网站中取消数据。Scrapy json响应转换utf-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文件,其中包含所需的输出格式。但问题是我的一些内容包含bengali文字。因此,在生成的输出文件,我得到了响应,如:

{"url": "/book/category/271/\u09a8\u09be\u099f\u0995", "name": "\u09a8\u09be\u099f\u0995"}

我怎么在utf-8内容编码?因为我是scrapy新手我没有设法根据我的方案找到合适的解决方案。

在此先感谢!

回答

7

首先,{"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为true(默认值),输出中的所有非ASCII字符都为\ uXXXX序列逃跑了,结果是只由ASCII字符的海峡实例。

这是Scrapy feed导出器默认使用的JSON输出。

但是,如果您需要输出JSON文件以使用其他编码,例如UTF-8,则可以使用Scrapy的FEED_EXPORT_ENCODING setting

FEED_EXPORT_ENCODING = 'utf-8'