2010-11-13 75 views
2

我正在解析用西班牙语写的网页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() 

当我尝试将其保存到一个分贝(A DBF数据库)我得到一个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

你可以发布你看到的实际错误,以及导致它的代码吗? – SimonJ 2010-11-13 23:34:45

+0

所以你从你的网页上获得unicode。这很好,就像它应该那样。这不是你的问题。你的问题是“将它保存为dbf数据库” - 你需要显示试图这样做的代码;我们没有水晶球。您需要给我们一个指向您正在使用的dbf-handling模块的链接。 – 2010-11-13 23:36:13

+0

另请确认您的意思是dBase III等Visual Foxpro使用的DBF文件 - 如果不是,它是什么? – 2010-11-13 23:43:09

回答

1

请,不记得DBF files don't support unicode at all ,我也建议使用伊森Furman的DBF包(在另一个答案链接)

只能使用“表= dbf.Table(”文件名')猜测真正的类型。

与非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”找到异常'TypeError:ord()例外字符...',行686

只有' dbf'表类型已经影响了这个tupo!

免责声明:我不知道在下面的值中使用真正的正确值,所以不要责怪我与这个“修复”不兼容。

您可以在490行和491行将''替换为'\ 0'(至少),以使此测试可行。

+0

我的dbf软件包的最新代码可以在[PyPI](http://pypi.python.org/pypi/dbf)上找到,在上面的例子中创建表的更简单的方法是'table = dbf。表(':内存','测试M',dbf_type ='vfp',codepage ='koi8-r')'。 – 2011-08-04 21:12:49

0

看起来http://sourceforge.net/projects/dbfpy是你在说什么。无论给你什么想法,它可以处理创建一个VFP兼容的DBF文件,只需通过将Unicode扔在它上面?有没有文档值得说明AFAICT和源根本不包含.encode(和有如果您在cp850编码文本字段更改默认的“签名”,从0×03(很平淡DBASEIII DILE)远/

不支持的方法或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。你是否设法让它起作用?

+0

谢谢你的回应。我会看看你提到的软件包。该库与一些演示数据运行良好。我知道备忘录不完全支持,我试图将字段更改为字符,并提出了相同的错误。 – mfalcon 2010-11-14 01:49:33

+0

@mfalcon:不支持备忘录全部(除非您调用引发NotImplementedError“部分支持”),这是编码问题的第二个问题。 – 2010-11-14 03:14:17

相关问题