2009-12-09 2 views
0

python으로 z39.50 검색을 만들고 있지만 검색 결과를 디코딩하는 데 문제가 있습니다.의회 도서관에서 왜곡 된 텍스트를 어떻게 해석합니까?

"해리 포터"에 대한 첫 번째 검색 결과는 분명히 히브리어 버전의 책입니다.

유니 코드로 만들려면 어떻게해야합니까?

이 내가 게시물 얻기 위해 사용하는 최소한의 코드입니다 : '아스키'코덱이 위치 788에 바이트은 0xF2을 디코딩 할 수 없습니다 : UnicodeDecodeError "의 스크립트 결과를 실행

#!/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) 

을 (범위에 있지 서수 128) "

+3

모든 프로토콜이 ** 고장을 **. 나는 당신이 사용하고있는 (나에게 알려지지 않은) 패키지 "PyZ3950"을 적게 생각하고 싶지 않기 때문에이 인코딩 정보를 어딘가에 가지고있을 것으로 기대한다! API를 살펴 보거나 데이터 스트림에서 실패합니다! – u0b34a0f6ae

+0

@ kaiser.se : 매우 사실입니다. ** IF ** 데이터는 실제로 합리적인 코덱으로 일부 유익한 유니 코드 텍스트를 인코딩 한 결과입니다. 가끔 그렇게 가정하는 것은 보증되지 않습니다. –

답변

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

당신이 그들이 사용하는 올바른 인코딩을 파악해야하고, 대신 당신은 히브리어 추측에 대한 권리 인 경우, 작동 할 수 있습니다 '창-1255'()의 놓을 게요.

+0

하지만 사용하기 위해 인코딩을 하드 코딩하는 것은 다른 문서이지만 똑같이 이상한 인코딩으로 인코딩 된 다음 문서에서는 실패합니다. – u0b34a0f6ae

1

문제를 재현하려고하지만, "DLL Hell"과 같은 Python을 사용하고 있습니다. 사용중인 각각의 버전 (Python, PyZ3950 및 PLY)을 지정하십시오.

ASCII가 아닌 바이트를 가져 오기 전에 788 바이트의 ASCII가 있음을 알리는 오류 메시지가 표시됩니다. 히브리어/아라비아어/그리스어/키릴 자모/기타와 같은 소리는 아니지만 비 ASCII 바이트를 사용하여 해당 언어에서 가장 자주 사용되는 문자를 나타냅니다.

print unicode(r.data) 대신 print type(r.data), repr(r.data)을 입력하고 결과를 보여주기 위해 질문을 편집하십시오.

업데이트가 나는 파이썬 2.6과 최신 PyZ3950의 버전 및 PLY 실행 얻을 관리 - PyZ3950/ccl.py에 from ply import lex 대신 import lex 필요 (마찬가지로 import yacc 고정

을 여기에 있습니다. 투기의 결과는 공을 명중 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도 있습니다. 각 덤프가 끝날 때마다 (그룹 | 유닛 | 기록) SEP 아마 ARATORs. 또한 두 번째 결과물이 험악 해 보이는 것처럼 보이지만 히브리어는 언급하지 않았습니다.

결론 : 히브리어를 잊어 버리십시오. 유니 코드는 잊어 버리십시오. 그 내용은 sensible_unicode_text.encode("any_known_encoding")이 아닙니다. Z3950은 천공 된 카드와 자기 드럼 및 테이프의 냄새를 맡습니다. 유니 코드에 대해 알고 있다면 해당 데이터에서 분명하지 않습니다.

PyZ3950과 함께 제공되는 ZOOM API 문서를 읽어야하고, ZOOM docs ... 행운을 가져다 줄 것 같습니다. 당신이 MARC

업데이트 3 ‏‪[2008]‬ 같은 드러내 BIDI 물건 최초의 덤프 ... 그래서 당신은 유니 코드로 끝날 것이다 이해할 필요가 같은

업데이트 2

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

이 보이는 결국, 당신은 무엇에 싸여있는 작업 워드 프로세서의 수준을 통해 드롭 다운 후 ...다시 행운을 빌어 요!

0

는 U는이를 위해 마크 데이터를 변환해야합니다 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() 
관련 문제