2009-12-09 55 views
0

我正在python中進行z39.50搜索,但在解碼搜索結果時遇到問題。如何解碼國會圖書館的亂碼文本?

第一個關於「哈利波特」的搜索結果表示該書的希伯來語版本。

我怎樣才能把它變成unicode?

這是最少的代碼,我用它來獲得一個帖子:

#!/usr/bin/env python 
# encoding: utf-8 

from PyZ3950 import zoom 
from PyZ3950 import zmarc 

conn = zoom.Connection('z3950.loc.gov', 7090) 
conn.databaseName = 'VOYAGER' 

query = zoom.Query('CCL', 'ti="HARRY POTTER"') 

res = conn.search(query) 

print "%d hits:" % len(res) 

for r in res[:1]: 
    print unicode(r.data) 

運行中「的UnicodeDecodeError腳本的結果:‘ASCII’編解碼器不能在788位解碼字節0xf2:有序不在範圍內( 128)」

+3

任何協議,而不顯式編碼** **破碎。我不想少想你使用的「PyZ3950」包,所以我希望它有這個編碼信息!在數據流中查看API或失敗的API! – u0b34a0f6ae 2009-12-09 14:04:21

+0

@ kaiser.se:非常真實,** IF **數據實際上是用合理的編解碼器編碼一些明智的Unicode文本的結果。有時候這樣做並不合理。 – 2009-12-09 14:55:07

回答

1
r.data.decode('windows-1255').encode('utf-8') 

你必須弄清楚他們使用正確的編碼,並把那不是‘窗口-1255’(這可能會工作,如果你是正確的希伯來猜測)。

+0

但是對要使用的編碼進行硬編碼將在下一個以不同但同樣奇怪的編碼編碼的文檔上失敗。 – u0b34a0f6ae 2009-12-09 14:06:49

1

我試圖重現您的問題,但我正在進入「DLL地獄」的Python等價物。請指定您正在使用的每個版本(Python,PyZ3950和PLY)。

您將從錯誤消息中注意到,在獲取非ASCII字節之前,有788個字節的ASCII。聽起來不像希伯來語/阿拉伯語/希臘語/西里爾語/等,它們使用非ASCII字節來表示這些語言中最常用的字符。

而不是print unicode(r.data),做print type(r.data), repr(r.data)並編輯您的問題以顯示結果。

更新我設法得到它與PyZ3950的最新版本,並PLY與Python 2.6運行 - 在PyZ3950/ccl.py需要from ply import lex而不是import lex(同樣地固定import yacc

這裏有。傾銷的結果命中0和命中200:

>>> print repr(res[0].data) 
"01688cam 22003614a 45000010009000000050017000090080041000260350018000670350020 
00085906004500105925004400150955002400194010001700218020001500235040001300250041 
00130026305000180027610000270029488000540032124000330037524501270040888001620053 
52460070006972600092007678800200008593000029010594900019010888800045011077000029 
01152880006301181700002901244880005301273\x1e16012113\x1e20091209015332.0\x1e091 
208s2008 is a   000 1 heb \x1e \x1fa(DLC)16012909\x1e \x1fa(DLC)200 
9664431\x1e \x1fa0\x1fbibc\x1fcorignew\x1fd3\x1fencip\x1ff20\x1fgy-nonroman\x1e 
0 \x1faacquire\x1fb1 shelf copies\x1fxpolicy default\x1e \x1fbcd06 2009-12-08 I 
BC\x1e \x1fa 2009664431\x1e \x1fa965511564X\x1e \x1faDLC\x1fcDLC\x1e1 \x1fah 
eb\x1fheng\x1e00\x1faPZ40.R685\x1fbH+\x1e1 \x1f6880-01\x1faRowling, J. K.\x1e1 \ 
x1f6100-01/(2/r‏\x1fa\x1b(2xelipb, b\x1b(B'\x1b(2i. wi.\x1b(B\x1e10\x1faH 
arry Potter and ??.\x1flHebrew\x1e10\x1f6880-02\x1faHari Po\xf2ter \xf2ve-misdar 
\xb0of ha-\xf2hol ? /\x1fcG'e. \xf2Ke. Roling ; me-Anglit, Gili Bar-Hilel Samu 
; iyurim, Mery Granpreh.\x1e10\x1f6245-02/(2/r‏\x1fa‏\x1b(2d`xi te 
hx e........‏ /\x1b(B\x1fc‏\x1b(2b\x1b(B'\x1b(2i. wi. xelipb ; n`p 
bliz, bili ax\x1b(B-\x1b(2dll qne ; `iexim, nxi bx`ptxd.\x1b(B\x1e1 \x1fiTitle o 
n t.p. verso:\x1faHarry Potter and the order of the phoenix ?\x1e \x1f6880-03\x 
1faTel-Aviv :\x1fbYedi\xb0ot a\xf2haronot :\x1fbSifre \xf2hemed :\x1fbSifre \xb0 
Aliyat ha-gag,\x1fcc[2008]\x1e \x1f6260-03/(2/r‏\x1fa‏\x1b(2zl\x1 
b(B-\x1b(2`aia‏ :\x1b(B\x1fb\x1b(2icirez `gxepez :‏\x1b(B\x1fb&#x2 
00f;\x1b(2qtxi gnc :‏\x1b(B\x1fb‏\x1b(2qtxi rliiz dbb,‏\x1b 
(B\x1fc‏‪[2008]‬\x1e \x1fa887 p. :\x1fbill. ;\x1fc21 cm.\x 
1e0 \x1f6880-04\x1faProzah\x1e0 \x1f6490-04/(2/r‏\x1fa‏\x1b(2txefd 
\x1b(B\x1e1 \x1f6880-05\x1faBar-Hilel, Gili.\x1e1 \x1f6700-05/(2/r‏\x1fa& 
#x200f;\x1b(2ax\x1b(B-\x1b(2dll qne, bili.\x1b(B\x1e1 \x1f6880-06\x1faGrandPr\xe 
2e, Mary.\x1e1 \x1f6700-06/(2/r‏\x1fa‏\x1b(2bx`ptxd, nxi.\x1b(B\x1 
e\x1d" 
>>> print repr(res[200].data) 
"01427cam 22003614a 45000010009000000050017000090080041000269060045000679250044 
00112955017900156010001700335020001800352020001500370035002400385040001800409042 
00140042705000220044110000280046324501160049126000760060730000200068344000350070 
35040041007386500018007796500013007976500017008106500041008276000019008686000039 
00887600004800926710005900974923003201033\x1e14882660\x1e20070925153312.0\x1e070 
607s2007 ie  b 000 0 eng d\x1e \x1fa7\x1fbcbc\x1fccopycat\x1fd3\x1fe 
ncip\x1ff20\x1fgy-gencatlg\x1e0 \x1faacquire\x1fb2 shelf copies\x1fxpolicy defau 
lt\x1e \x1fanb05 2007-06-07 z-processor ; nb05 2007-06-07 to HLCD for processin 
g;\x1falk21 2007-08-09 to sh00\x1fish21 2007/09-18 (telework)\x1fesh49 2007-09-2 
0 to BCCD\x1fesh45 2007-09-25 (Revised)\x1e \x1fa 2007390561\x1e \x1fa9780955 
492617\x1e \x1fa0955492610\x1e \x1fa(OCoLC)ocn129545188\x1e \x1faVYF\x1fcVYF\ 
x1fdDLC\x1e \x1falccopycat\x1e00\x1faBT1105\x1fb.H44 2007\x1e1 \x1faHederman, M 
ark Patrick.\x1e10\x1faHarry Potter and the Da Vinci code :\x1fb'Thunder of a Ba 
ttle fought in some other Star' /\x1fcMark Patrick Hederman.\x1e \x1faDublin :\ 
x1fbDublin Centre for the Study of the Platonic Tradition,\x1fc2007.\x1e \x1fa3 
8 p. ;\x1fc21 cm.\x1e 0\x1faPlatonic Centre pamphlets ;\x1fv2\x1e \x1faIncludes 
bibliographical references.\x1e 0\x1faChristianity.\x1e 0\x1faMystery.\x1e 0\x1 
faImagination.\x1e 0\x1faPotter, Harry (Fictitious character)\x1e10\x1faRowling, 
J. K.\x1e10\x1faBrown, Dan,\x1fd1964-\x1ftDa Vinci code.\x1e10\x1faYeats, W. B. 
\x1fq(William Butler),\x1fd1865-1939.\x1e2 \x1faDublin Centre for the Study of t 
he Platonic Tradition.\x1e \x1fd20070411\x1fn565079784\x1fsKennys\x1e\x1d" 

你會發現,有相當一部分在它炸燬了部分之前的「ASCII」一部分\ X1E和\ X1F的還有一個\ X1D。在每次轉儲結束時(GROUP | UNIT | RECORD)SEP也許是阿拉伯人。你還會注意到第二個輸出看起來像是gobbledegook,但它沒有提到希伯來語。

結論:忘記希伯來語。忘記Unicode - 那東西不是sensible_unicode_text.encode("any_known_encoding")的結果。 Z3950衝孔卡片和磁鼓和磁帶。如果它知道Unicode,那在這些數據中就不明顯了。

看起來你需要閱讀PyZ3950附帶的ZOOM API文檔,那會導致你到ZOOM docs ......祝你好運。

更新2

>>> r0 = res[0] 
>>> dir(r0) 
['__doc__', '__init__', '__module__', '__str__', '_rt', 'data', 'databaseName', 
'get_field', 'get_fieldcount', 'is_surrogate_diag', 'syntax'] 
>>> r0.syntax 
'USMARC' 
>>> 

看起來你需要了解MARC

更新3注意的BIDI東西,如‏‪[2008]‬第一轉儲...所以你會使用Unicode結束最終,在你通過文檔的層次來確定什麼包裹在什麼內容之後......再次祝你好運!

0

ü需要轉換馬克數據爲這樣: U可以使用以下代碼:

from pymarc import MARCReader 
temp_list = [] 
for i in range(0, 2):# You can take len(res) here for all results 
    temp_list.append(res[i].data) 
for i in range(0, 2):# You can take len(res) here for all results 
    reader = MARCReader(temp_list[i]) 
    for i in reader: 
     print i.title(),i.author()