我正在使用scrapy解析用西班牙语编写的网页。问题是由于编码错误,我无法保存文本。
这是解析函数:
def parse(self, response):
hxs = HtmlXPathSelector(response)
text = hxs.select('//text()').extract() # Ex: [u' Sustancia mineral, m\xe1s o menos dura y compacta, que no es terrosa ni de aspecto met\xe1lico.']
s = "".join(text)
db = dbf.Dbf("test.dbf", new=True)
db.addField(
("WORD", "C", 25),
("DATA", "M", 15000), # Memo field
)
rec = db.newRecord()
rec["WORD"] = "Stone"
rec["DATA"] = s
rec.store()
db.close()
当我尝试将其保存到db(dbf db)时,我收到ASCII(128)错误。我尝试使用'utf-8'和'latin1'进行解码/编码,但没有成功。
编辑:
保存数据库我正在使用dbfpy。我在上面的解析函数中添加了dbf保存代码。
这是错误消息:
Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 1179, in mainLoop
self.runUntilCurrent()
File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 778, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 280, in callback
self._startRunCallbacks(result)
File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 354, in _startRunCallbacks
self._runCallbacks()
--- <exception caught here> ---
File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 371, in _runCallbacks
self.result = callback(self.result, *args, **kw)
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/rae_spider.py", line 54, in parse
rec.store()
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/record.py", line 211, in store
self.dbf.append(self)
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/dbf.py", line 214, in append
record._write()
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/record.py", line 173, in _write
self.dbf.stream.write(self.toString())
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/record.py", line 223, in toString
for (_def, _dat) in izip(self.dbf.header.fields, self.fieldData)
File "/home/katy/Dropbox/proyectos/rae/rae/spiders/fields.py", line 215, in encodeValue
return str(value)[:self.length].ljust(self.length)
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 18: ordinal not in range(128)
答案 0 :(得分:1)
请不要记住DBF files don't support unicode at all 我还建议使用Ethan Furman的dbf包(链接在另一个答案中)
您只能使用'table = dbf.Table('filename')来猜测实际类型。
非cp437编码的使用示例是:
#!/usr/bin/env python
# coding: koi8-r
import dbf
text = 'текст в koi8-r'
table = dbf.Table(':memory:', ['test M'], 128, False, False, True, False, 'dbf', 'koi8-r')
record = table.append()
record.test = text
请注意有关版本0.87.14和'dbf'表格类型的以下信息:
使用DBF包0.87.14,你可以在“... / site-packages / dbf / tables.py”,第686行找到异常'TypeError:ord()例外字符......'
此'tupo仅影响'dbf'表类型!
免责声明:我不知道在以下值中使用真正正确的值,所以不要怪我与此“修复”不兼容。
您可以在第490行和第491行将值''替换为'\ 0'(至少),以使此测试可行。
答案 1 :(得分:0)
看起来http://sourceforge.net/projects/dbfpy就是您所说的。无论是什么让你觉得它可以通过抛出Unicode来处理创建一个兼容VFP的DBF文件?没有值得描述AFAICT的文档,并且源代码不包含.encode(
,并且没有支持的方法将默认“签名”从0x03更改(非常简单的dBaseIII dile)/
如果在将cp850
或cp437
中的文本字段编入dbf之前对其进行编码,它可能会起作用,但您需要检查是否可以使用VFP打开生成的文件当您在屏幕上查看文本字段时,所有重音西班牙语字符都会正确显示。
如果这不起作用(即使它确实如此),你应该看看Ethan Furman's dbf package ......它声称知道所有关于VFP和语言驱动程序ID和代码页等等。
更新:我看到您定义了15000字节的备忘录字段。我们中的一个人错过了一些东西......我正在阅读的代码在fields.py
中关于第330行Note: memos aren't currenly [sic] completely supported
的内容稍后会出现两次raise NotImplementedError
...第3行:TODO: - make memos work
。当我尝试使用您使用的代码(使用纯ASCII数据)时,它从rec.store()
引发了NotImplementedError。你有没有设法让它工作?