2010-11-13 77 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

相關問題