我在使用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
答案 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
希望这有帮助!