Python 在Django和Android中对零散数据进行编码以显示

Python 在Django和Android中对零散数据进行编码以显示,python,django,json,encoding,scrapy,Python,Django,Json,Encoding,Scrapy,我做了一个噩梦,数据被刮得乱七八糟。目前我使用UTF-8编码,即detail\u内容。选择('p/text()[1]”)。提取()[0]。编码('UTF-8')保存到JSON文件中,然后使用Django和移动应用程序再次显示捕获的文本 在JSON文件中,转义的HTML使用unicode进行转义'blah blah\u00A34000 blah' 现在我的问题是,当我尝试在django模板或移动应用程序中显示文本时,实际的文字字符显示为:\u00a3,而不是。 我不应该在JSON中存储转义的uni

我做了一个噩梦,数据被刮得乱七八糟。目前我使用UTF-8编码,即
detail\u内容。选择('p/text()[1]”)。提取()[0]。编码('UTF-8')
保存到JSON文件中,然后使用Django和移动应用程序再次显示捕获的文本

在JSON文件中,转义的HTML使用unicode进行转义
'blah blah\u00A34000 blah'

现在我的问题是,当我尝试在django模板或移动应用程序中显示文本时,实际的文字字符显示为:
\u00a3
,而不是

我不应该在JSON中存储转义的unicode吗?使用JSON转义将ASCII存储在JSON文件中是否更好?如果是这样的话,你该如何处理scrapy

报废代码:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from scrapy.item import Item, Field
import datetime
import unicodedata
import re

class Spider(BaseSpider):
    #spider stuff

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        rows = hxs.select('//ul[@class = "category3"]/li')
        for row in rows:
            item = Item()
            if len(row.select('div[2]/a/text()').extract()) > 0:
                item['header'] = str(row.select('div[2]/a/text()')
                                    .extract()[0].encode('utf-8'))
            else:
                item['header'] = ''
            if len(row.select('div[2]/a/text()').extract()) > 0:
                item['_id'] = str(row.select('div[2]/a/text()')
                                    .extract()[0].encode('utf-8'))
            else:
                item['_id'] = ''
            item['_id'] = self.slugify(item['_id'])[0:20]
            item_url = row.select('div[2]/a/@href').extract()
            today = datetime.datetime.now().isoformat()
            item['dateAdded'] = str(today)
            yield Request(item_url[0], meta={'item' : item},
                             callback=self.parse_item)

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        detail_content = hxs.select('//*[@id="content-area"]')
        item = response.request.meta['item']   
        item['description'] = str(detail_content.select('p/text()[1]')
                                                        .extract()[0])
        item['itemUrl'] = str(detail_content.select('//a[@title="Blah"]/@href')
                                                                 .extract()[0])
        item['image_urls'] = detail_content.select('//img[@width="418"]/../@href')
                                                                        .extract()
        print item
        return item

好吧,我觉得这很奇怪:

item['header'] = str(row.select('div[2]/a/text()')
                     .extract()[0].encode('utf-8'))
执行
str(.encode('utf-8'))
不正确。这基本上意味着您正在将一组utf-8字节转换为ascii。当utf-8字节超过128时,这可能会产生错误

现在,我坚信你已经用unicode从Scrasty获得了字符

我收到的错误如下:
exceptions.UnicodeEncodeError:“ascii”编解码器无法对127位的字符u'\u201c'进行编码:序号不在范围(128)内。

因此,我的建议是将代码更改为:

item['header'] = row.select('div[2]/a/text()')
                 .extract()[0].encode('utf-8')
只需删除
str()
调用。这将从Scrasty接收unicode并将其转换为
utf-8
。一旦进入
utf-8
。小心字符串操作。通常,从unicode到特定编码的转换应该在写入磁盘之前完成

注意这种代码有两处。同时修改它们

更新:看看这个,可能会有帮助:


希望这有帮助

您是否尝试过不使用
编码('utf-8')
?另一个问题是:
detail\u content.select('p/text()[1]”)的输出是什么。extract()[0]
。我的意思是,是
u'blah blah'
还是仅仅
'blah blah'
还有,你是如何在模板中输出json的?是的,在没有编码('utf-8')的情况下尝试过,我收到了如下错误:
异常。UnicodeEncodeError:'ascii'编解码器无法对127位的字符u'\u201c'进行编码:序号不在范围内(128)
我正在以常规方式输出django模板中的文本,即
{{item.description}
自动转义打开或关闭没有任何区别您可以发布更多代码背景。通常,如果您使用
utf-8
编码,字符串\u00a3不应出现在
.json
文件中。@PauloBu好的,我已经添加了代码。关于str(),您是对的,这不是必需的。不知道我为什么用它,谢谢!然而,我仍然有同样的问题。原始HTML中没有unicode转义字符。Scrapy看起来像是在其他事情发生之前将HTML转换成UTF-8对不起,我先不明白。因此,原始HTML中没有unicode替换字符。Scrapy可能正在做的是将其转换为Unicode,而不是
utf-8
您的.json文件中是否仍有\u00a3?刚刚检查,是的,它是Unicode而不是utf-8抱歉,我只是假设它是utf-8,因为我有我的代码。是,仍然可以获得\u00a3。所有非标准字符都被转义\uxxx您可以发布如何编写
.json
文件吗?