2017-01-04 102 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'