解析西班牙文本并将其保存在数据库中

时间:2010-11-13 23:17:37

标签: python parsing unicode

我正在使用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)

2 个答案:

答案 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)/

如果在将cp850cp437中的文本字段编入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。你有没有设法让它工作?