1

我正在做一场噩梦,数据被 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进行此操作?

杂乱无章的代码:

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
4

1 回答 1

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 时,这可能会产生错误。

现在,我坚信您已经在 unicode 中从 Scrappy 获取字符。

我收到如下错误: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

希望这可以帮助!

于 2013-06-20T13:54:18.313 回答