# -*- 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