Utente:Alebot/OCR scripts
Aspetto
# -*- coding: cp1252 -*- import pickle, htmlentitydefs # si rende disponibile un vocabolario entitydefs: entità HTML->carattere global pagine,entitydefs def estrai(xmlfile): #senza estensione: per indicare il file colombodjvu.xml scrivere colombodjvu f=open(xmlfile+".xml") xml=unicode(f.read(),"utf-8") # tutto il file viene letto in una stringa che vciene codificata in Unicode #xml=post_el(xml) f.close() #elimino eventuali doppie quadre pagine=estrai_elementi(xml,"OBJECT") # ogni pagina è contenuta fra tag OBJECT. Viene creata una lista di pagine "grezze" for i in range(len(pagine)): pagine[i]=estrai_testo_pagina(pagine[i]) #pagina per pagina si estrae il testo pagine[0:0]=" " #si aggiunge in testa una pagina[0] per allineare gli indici con i numeri pagina txt="" for i in range(len(pagine)): print i, pagine[i]=post_el(pagine[i]) # si esegue postelaborazione sulle pagine in Unicode txt=txt+"["+str(i)+"]"+pagine[i].encode("cp1252","ignore")+"[/"+str(i)+"]" #si aggiungono i tag di inizio e fine pagina # e si codifica in cp1252 salva_pcl(pagine,xmlfile) # si salva come lista in nomefile.pcl salva(txt,xmlfile) # e come testo txt in nomefile.txt print "Fine programma. Le pagine sono salvate come lista qui: "+xmlfile+\ '\nPer caricare il file usare il comando p=carica_pcl(NomeFileSenzaEstensione)' return pagine def post_el(testo): #print "Sostituisco html entities" testo=entities2txt(testo) #trasformo i > in virgole testo=testo.replace(">",",") testo=testo.replace("^","'") testo=testo.replace(u"»",",") testo=testo.replace(u"•",".") #elimino eventuali quadre testo=testo.replace("[","(") testo=testo.replace("]",")") #print "Aggiusto gli apostrofi..." testo=testo.replace(u"'",u"’") #print "Sistemo gli spazi..." testo=spazi(testo) #print "Riunisco le parole spezzate..." testo=spezzate(testo) return testo def entities2txt(testo): testo=testo.replace("<","<") testo=testo.replace(">",">") testo=testo.replace("&","&") testo=testo.replace(""",'"') return testo def spezzate(x): x.replace("- \n","-\n") while "-\n" in x: ptrattino=x.find("-\n") pcaratt=ptrattino+2 while pcaratt < len(x): if x[pcaratt:pcaratt+1].isalpha(): break else: pcaratt=pcaratt+1 pparola=ptrattino-2 while True: if x[pparola-1:pparola].isalpha(): pparola=pparola-1 else: break x=x[:pparola]+"\n"+x[ptrattino+2:pcaratt]+x[pparola:ptrattino]+x[pcaratt:] return x def salva_pcl(variabile,nome_file="dato"): nome_file=nome_file+".pcl" f=open(nome_file,"w") pickle.dump(variabile, f) f.close() print "Variabile salvata nel file "+nome_file return # loads a variable def carica_pcl(nome_file): nome_file=nome_file+".pcl" f=open(nome_file) contenuto=pickle.load(f) f.close() return contenuto def spazi(t): for i in ".,;!?:": t=t.replace(" "+i,i+" ") t=t.replace(" "," ") t=t.replace(u" ’",u"’") t=t.replace(u"’ ",u"’") for i in [u"o’",u"a’",u"i’",u"u’", u"e’"]: t=t.replace(i,i+" ") return t def estrai_txt(file_input): file_input=file_input+".txt" f=open(file_input) fi=f.read() f.close() p=[] p.append(" ") pagenum=1 while True: tagi="["+str(pagenum)+"]" tagf="[/"+str(pagenum)+"]" if fi.find(tagi)>-1 and fi.find(tagf)>-1: fi,page=el_st(fi,tagi,tagf) p.append(page) pagenum=pagenum+1 print pagenum, else: break p=elimina_numero_righe(p) p=elimina_prima_riga(p) p=aggiungi_header_footer(p) r=" " while not r in "fF": r=raw_input("pagina: numero; e=elimina prima riga; f: fine.") if r.isdigit(): print p[eval(r)] return p def aggiungi_header_footer(lista): header='''<noinclude>{{PageQuality|1|Alebot}}<div class="pagetext"> </noinclude>''' footer='''<noinclude> <references/></div></noinclude>''' for i in range(len(lista)): lista[i]=header+lista[i]+footer return lista def elimina_prima_riga(lista): for i in range(len(lista)): acapo=lista[i].find("\n") lista[i]=lista[i][acapo:].strip() return lista def elimina_numero_righe(lista): for i in range(len(lista)): lista[i]=lista[i].replace("["+str(i)+"]","") lista[i]=lista[i].replace("[/"+str(i)+"]","") return lista def apri(f): fi=open(f) t=fi.read() fi.close() print "letto file", f return t def salva(t,f): f=f+".txt" fo=open(f,"w") fo.write(t) fo.close() print "Salvato su",f return # looks for the first substring beginning with idi and ending with ifd and returns it with or without (default) delimiters def find_stringa(stringa,idi,idf,dc=0): idip=stringa.find(idi) idfp=stringa.find(idf,idip)+len(idf) if idip>-1 and idfp>0: if dc==0: vvalore=stringa[idip+len(idi):idfp-len(idf)] else: vvalore=stringa[idip:idfp] else: vvalore="" return vvalore # extracts the first substring (beginning with idi and ending with idf) # from a string; replaces the substring with new (default empty string); returns the replaced main string and te substring def el_st(stringa,idi,idf,new=""): idip=stringa.find(idi) idfp=stringa.find(idf,idip)+len(idf) if idip>-1 and idfp>0: vvalore=stringa[idip:idfp] valore=stringa.replace(vvalore,new,1) else: vvalore="" valore=stringa return valore, vvalore # returns a list of all substrings (beginning with idi and ending with idf) # of a string; ; used for xml data managing too def produci_lista(testo,idi,idf,dc=0): t=testo[:] lista=[] while not find_stringa(t,idi,idf)=="": el=find_stringa(t,idi,idf,1) t=t.replace(el,"") #print el if dc==0: el=find_stringa(el,idi,idf,0) #print el #print lista.append(el) return lista ### XML parsing routines def estrai_elementi(codice,tag): tag1="<"+tag tag2="</"+tag+">" lista=produci_lista(codice,tag1,tag2,1) for i in range(len(lista)): lista[i]=el_st(lista[i],tag1,">")[0] lista[i]=lista[i].replace(tag2,"") return lista def estrai_testo_pagina(pagina): lista_paragrafi=estrai_elementi(pagina,"PARAGRAPH") for i in range(len(lista_paragrafi)): lista_linee=estrai_elementi(lista_paragrafi[i],"LINE") for j in range(len(lista_linee)): lista_linee[j]=estrai_elementi(lista_linee[j],"WORD") lista_linee[j]=" ".join(lista_linee[j]) lista_paragrafi[i]="\n".join(lista_linee)+"\n" #testo_pagina=unicode("\n".join(lista_paragrafi).replace("'","'"),"utf-8") testo_pagina="\n".join(lista_paragrafi).replace("'","'") return testo_pagina