编码Scrapy数据以在Django和Android中显示

时间:2013-06-20 13:11:42

标签: python django json encoding scrapy

我在使用Scrapy报废数据时遇到了噩梦。目前我使用UTF-8对其进行编码,即将detail_content.select('p/text()[1]').extract()[0].encode('utf-8')保存到JSON文件中,然后使用Django和移动应用程序再次显示捕获的文本。

在JSON文件中,转义的HTML使用unicode 'blah blah \u00a34,000 blah'

进行转义

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

我不应该在JSON中存储转义的unicode吗?使用JSON转义将ASCII存储在JSON文件中会更好吗?如果是这样,你怎么用scrapy做这个呢?

Scrappy代码:

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

1 个答案:

答案 0 :(得分:0)

好的,我发现很奇怪:

item['header'] = str(row.select('div[2]/a/text()')
                     .extract()[0].encode('utf-8'))

str(<some_value>.encode('utf-8'))不正确。这基本上意味着你将utf-8字节转换为ascii。当utf-8字节超过128时,这可能会产生错误。

现在,我坚信你已经在scrappy中获得了unicode中的角色。

  

我收到如下错误:exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 127: ordinal not in range(128)

所以,我的建议是将代码更改为:

item['header'] = row.select('div[2]/a/text()')
                 .extract()[0].encode('utf-8')

只需删除str()来电即可。这将获得从Scrappy收到的unicode并将其转换为utf-8。一旦进入utf-8。小心字符串操作。通常,这种从unicode到特定编码的转换应该在写入磁盘之前完成。

注意您在两个地方都有这种代码。修改它们。

更新:看看这个,可能会有所帮助:scrapy text encoding

希望这有帮助!