Usuari:PereBot/robot puja monuments a Wikidata
Aparença
Versió puja i baixa
[modifica]Versió que copia dades de les llistes a Wikidata a les llistes i de les llistes a Wikidata. Fa servir mwparserfromhell per llegir i editar les plantilles filera de les llistes de monuments (i altres llistes).
# -*- coding: utf-8 -*-
# Programa per pujar a Wikidata les dades dels monuments
# a partir de les llistes. Només puja les dades dels monuments amb
# article a cawiki.
# Puja commonscat, coordenades, foto, municipi (si el troba),
# estatus patrimonial i números de registre (si a Wikidata hi ha la propietat).
# El resultat es un codi per posar al quickstatements.
# A la vegada actualitza les llistes amb les dades de Wikidata.
import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,json,pickle,math
import mwparserfromhell
# Elimina duplicats d'una llista
def unic(llista):
llistanova=[]
for el in llista:
if not el in llistanova:
llistanova.append(el)
return llistanova
# Elimina l'enllaç d'un text. Funciona bé si hi ha un sol enllaç.
# Deixa el text que mostra l'enllaç (no on apunta)
def eliminaenllac(nom):
nom=re.sub(u"\[\[.*\|","",nom)
nom=nom.replace("[[","")
nom=nom.replace("]]","")
return nom
def plant(tit):
return pywikibot.Page(site,u"Plantilla:{}".format(tit))
def actuallista(pllista,pagprova=False):
resultat=u""
origen=pllista.title()
text=pllista.get()
text0=text
code = mwparserfromhell.parse(text)
t=code.filter_templates();
# Comença a buscar els articles enllaçats a 2 o més fileres per no actualtzar-les
evistos=[]
erepe=[]
#print t
for template in t:
enllac=u""
if template.has("nom"):
nom=unicode(template.get("nom").value)
nom=re.sub(u" *?nom *?= *?","",nom)
nom=re.sub(u"<ref name.*>.*<.*>","",nom)
nom=re.sub(u"<ref ?>.*<.*>","",nom)
nom=re.sub(u"<.*>","",nom)
nom=nom.strip()
#print u"nom:",nom
if len(re.findall(u"\[\[",nom))>1:
print u"PERILL: 2 enllaços a",nom
if re.search(u"\[\[.*\]\]",nom):
enllac=re.sub(u"^.*?\[\[","",nom)
enllac=re.sub(u"\]\].*?$","",enllac)
enllac=re.sub(u"\|.*?$","",enllac)
nomnet=eliminaenllac(nom)
#print u"enllaç:",enllac
else:
nomnet=nom
if enllac.lower() in evistos:
erepe.append(enllac.lower())
else:
evistos.append(enllac.lower())
print "enllaços repetits:",erepe
#print "enllaços vistos:",evistos
diccesp={}
diccmunicipis={}
diccprot={u"BIC":u"Q23712",u"BRL":u"Q11910247",u"BCIN":u"Q1019352",u"BCIL":u"Q11910250"}
diccprot[u"BCIN-ZA"]=u"Q1019352"
diccprot[u"PH.BCIN"]=u"Q1019352"
diccprot[u"Inv."]=u"Q10387575"
diccprot[u"Cat."]=u"Q10387684"
diccprotand={u"BIC":u"Q5004973",u"BI":u"Q21095081"}
classe0=u""
for template in t:
if template.name.matches((u'Filera art públic',)):
classe0=u"art"
elif template.name.matches((u'Filera IPA',u'Filera MH',u'Filera BIC',u'Filera BIC Val',u'Filera BIC And',u'filera BC Sard',u'filera BIC-ZA')):
classe0=u"monument"
elif template.name.matches((u'Filera patrimoni natural',)):
classe0=u"natural"
else:
continue
if classe0!=u"":
classe=classe0
proposta=""
nom=u""
enllac=u""
if template.has("nom"):
nom=unicode(template.get("nom").value)
nom=re.sub(u" *?nom *?= *?","",nom)
nom=re.sub(u"<ref name.*>.*<.*>","",nom)
nom=re.sub(u"<ref ?>.*<.*>","",nom)
nom=re.sub(u"<.*>","",nom)
nom=nom.strip()
print nom
if len(re.findall(u"\[\[",nom))>1:
print u"PERILL: 2 enllaços a",nom
if re.search(u"\[\[.*\]\]",nom):
enllac=re.sub(u"^.*?\[\[","",nom)
enllac=re.sub(u"\]\].*?$","",enllac)
enllac=re.sub(u"\|.*?$","",enllac)
nomnet=eliminaenllac(nom)
# print enllac
else:
nomnet=nom
else:
continue
if enllac==u"":
continue
elif enllac.lower() in erepe:
print nom,u"ignorat per enllac",enllac,u"repetit"
continue
elif u"#" in enllac:
print nom,u"enllaçat a secció",enllac
continue
pag=pywikibot.Page(site,enllac)
try:
text=pag.get()
except pywikibot.NoPage:
continue
except pywikibot.IsRedirectPage:
pag=pag.getRedirectTarget()
if pag.title().lower() in erepe:
print nom,u"ignorat per redirecció",enllac,u"a enllaç repetit"
continue
elif u"#" in pag.title():
print nom,u"enllaçat a secció",enllac
continue
try:
textnul=pag.get()
except pywikibot.NoPage:
continue
except pywikibot.IsRedirectPage:
print pag,u"doble redirecció"
continue
except pywikibot.InvalidTitle:
print u"títol invàlid"
continue
cats=pag.categories()
print pag
esmon=False
esart=False
esnat=False
for cat in cats:
ticat=cat.title()
#print ticat
if re.search(u"Categoria:(Monuments|Patrimoni monumental|Béns (Culturals|d'Interès)|Edificis|Castells|Esglésies|Ermites|Catedrals|Ponts)",ticat) and not re.search(u"Categoria:Llistes",ticat):
esmon=True
if re.search(u"Categoria:(Escultures)",ticat) and not re.search(u"Categoria:Llistes",ticat):
esart=True
if re.search(u"Categoria:(Muntanyes|Arbres|Platges|Estanys|Hàbitats|Parc|Volcans|Espais|Reserves|Rius|Rieres|Boscs|Zones humides|Illes|Illots|Coves|Jaciment|Arxipèlags|Paratges|.* individuals)",ticat) and not re.search(u"Categoria:Llistes",ticat):
esnat=True
if esmon==False and classe==u"monument":
print pag,u"monument sense categories de monuments"
continue
if esart==False and esmon==False and classe==u"art":
print pag,u"art públic sense categories de monuments ni d'art"
continue
if esnat==False and classe==u"natural":
print pag,u"natural sense categories de natural"
continue
#plants=pag.templates()
#print plants
#if plant(u"commonscat") in plants:
# print u"ja hi ha Commonscat"
#if plant (u"coord") in plants:
# print u"ja hi ha Coord"
try:
pagdata=pywikibot.ItemPage.fromPage(pag)
cont=pagdata.get()
except NotImplementedError:
print u"NotImplementedError: (possiblement detecta unitats)"
continue
except pywikibot.NoPage:
print u"No hi ha pàgina a Wikidata"
continue
qitem=pagdata.title()
print u"id de Wikidata:",qitem
ccatt=u""
if template.has("commonscat"):
ccatt=template.get("commonscat").value
ccatt=ccatt.strip(u"\n").strip()
if len(ccatt)<3:
ccatt=u""
if "P373" in pagdata.claims:
ccatd=pagdata.claims['P373'][0].getTarget()
ccatd=ccatd.replace(u"\n",u"").strip()
if ccatt<>u"":
print u"Commonscat a tot arreu"
print unicode(ccatd),unicode(ccatt)
if ccatd<>ccatt:
print u"PROBLEMA: ccat SÓN DIFERENTS",len(ccatd.strip()),len(ccatt.strip())
else:
print "copiar commonscat a la llista"
print unicode(ccatd)
template.add("commonscat",ccatd+u"\n")
else:
if ccatt<>u"":
print u"pujar commonscat a Wikidata"
linia=u'{}\tP373\t"{}"\tS143\tQ199693'.format(qitem,ccatt)#commonscat
print linia
resultat=resultat+u"\n"+linia
else:
print "commonscat enlloc"
imgt=u""
if template.has("imatge"):
imgt=template.get("imatge").value
imgt=imgt.strip().strip(u"\n").replace(u"_",u" ")
if len(imgt)<4:
imgt=u""
if "P18" in pagdata.claims:
imgd=pagdata.claims['P18'][0].getTarget()
print imgd
imgd=imgd.title().strip().strip(u"\n").replace(u"File:",u"")
print imgd
if imgt<>u"":
print u"imatge a tot arreu"
print unicode(imgd),unicode(imgt)
if imgd<>imgt:
print u"PROBLEMA: imatges SÓN DIFERENTS",len(imgd),len(imgt)
else:
print "copiar imatge a la llista"
print unicode(imgd)
if imgd.lower() in text0.lower():
print u"la imatge ja és en algun lloc de la llista"
else:
if template.has("imatge"):
template.get("imatge").value.replace(template.get("imatge").value,imgd+u"\n")
else:
template.add("imatge",imgd+u"\n")
else:
if imgt<>u"":
print u"pujar commonscat a Wikidata"
linia=u'{}\tP18\t"{}"\tS143\tQ199693'.format(qitem,imgt)#commonscat
print linia
resultat=resultat+u"\n"+linia
else:
print "imatge enlloc"
latt=u""
lont=u""
if template.has("lat") and template.has("lon"):
latt=template.get("lat").value
latt=latt.strip().strip(u"\n").replace(u"_",u" ")
if len(latt)<2:
latt=u""
lont=template.get("lon").value
lont=lont.strip().strip(u"\n").replace(u"_",u" ")
lont=re.sub(u"<!--.*",u"",lont)
#lont=re.sub(lont #aquí treure el comentari
if len(lont)<2:
lont=u""
if "P625" in pagdata.claims:
coord=pagdata.claims['P625'][0].getTarget()
#print unicode(coord)
#print coord.lat,coord.lon
latd=unicode(coord.lat)
lond=unicode(coord.lon)
if latt<>u"" and lont<>u"":
print u"coordenades a tot arreu.",unicode(coord),unicode(latt),unicode(lont)
else:
print "copiar coordenades a la llista"
print unicode(coord)
if latd.lower() in text0.lower() or lond.lower() in text0.lower():
print u"aquestes coordenades ja són en algun element de la llista"
else:
if template.has("lat"):
template.get("lat").value.replace(template.get("lat").value,latd)
else:
template.add("lat",latd)
if template.has("lon"):
template.get("lon").value.replace(template.get("lon").value,lond+u"\n")
else:
template.add("lon",lond+u"\n")
else:
if latt<>u"" and lont<>u"":
print u"pujar coordenades a Wikidata"
linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,latt,lont)
print linia
resultat=resultat+u"\n"+linia
else:
print "coordenades enlloc"
if template.has("municipi"): #Per fer: ignorar els casos amb més d'un enllaç
municipi=template.get("municipi").value
municipi=municipi.strip().replace(u"\n",u"")
municipi=re.sub(u"^.*?\[\[","",municipi)
municipi=re.sub(u"\]\].*?$","",municipi)
municipi=re.sub(u"\|.*?$","",municipi)
if len(municipi)>1:
if municipi in diccmunicipis.keys():
qmun=diccmunicipis[municipi]
datamun=pywikibot.ItemPage(repo,qmun)
else:
textmunicipi=u""
artmun=pywikibot.Page(site,municipi)
try:
try:
textmunicipi=artmun.get()
except pywikibot.IsRedirectPage:
artmun=artmun.getRedirectTarget()
textmunicipi=artmun.get()
except pywikibot.NoPage:
print u"Error municipi:",municipi,u"no existeix"
qmun=u""
except pywikibot.InvalidTitle:
print u"Error municipi:",municipi,u"títol invàlid"
qmun=u""
if re.search(u"\{\{[Ii]nfotaula( del?)? (municipi|parròquia)",textmunicipi):
datamun=pywikibot.ItemPage.fromPage(artmun)
qmun=datamun.title()
print u"id de Wikidata:",qmun
diccmunicipis[municipi]=qmun
#print diccmunicipis
else:
print u"Error municipi:",municipi,u"no té infotaula de municipi"
qmun=u""
except pywikibot.NoPage:
print u"Error municipi:",municipi,u"no existeix"
qmun=u""
except pywikibot.InvalidTitle:
print u"Error municipi:",municipi,u"títol invàlid"
qmun=u""
if "P131" in pagdata.claims and len(qmun)>1:
#print u"hi ha entitat administrativa"
llistaadm=[]
for clam in pagdata.claims['P131']:
llistaadm.append(clam.getTarget())
#print u"municipi:",datamun,qmun
#print u"a Wikidata:",llistaadm
if datamun in llistaadm:
hihamundata=True
#print u"ja hi ha aquest municipi"
else:
hihamundata=False
else:
hihamundata=False
if len(qmun)>1 and hihamundata==False and qitem<>qmun:
print municipi,qmun
linia=u"{}\tP131\t{}\tS143\tQ199693".format(qitem,qmun)
print linia
resultat=resultat+u"\n"+linia
if template.has(u"tipus"):
tipus=template.get("tipus").value
tipus=tipus.strip().replace(u"\n",u"")
if re.search(u"\[\[.*\]\]",tipus):
enllactipus=re.sub(u"^.*?\[\[","",tipus)
enllactipus=re.sub(u"\]\].*?$","",enllactipus)
enllactipus=re.sub(u"\|.*?$","",enllactipus)
# print enllactipus
else:
enllactipus=u""
else:
tipus=u""
enllactipus=u""
if template.has(u"material"):
material=template.get("material").value
material=material.strip().replace(u"\n",u"")
if re.search(u"\[\[.*\]\]",material):
enllacmaterial=re.sub(u"^.*?\[\[","",material)
enllacmaterial=re.sub(u"\]\].*?$","",enllacmaterial)
enllacmaterial=re.sub(u"\|.*?$","",enllacmaterial)
# print enllacmaterial
else:
enllacmaterial=u""
else:
material=u""
enllacmaterial=u""
if len(enllactipus+enllacmaterial)>0 and u"arbres" in origen: #espècies
if len(enllactipus)==0:
especie=enllacmaterial
else:
especie=enllactipus
if especie in diccesp.keys():
qesp=diccesp[especie]
dataesp=pywikibot.ItemPage(repo,qesp)
else:
artesp=pywikibot.Page(site,especie)
try:
if artesp.isRedirectPage():
print artesp,u"redirecció"
artesp=artesp.getRedirectTarget()
print u"redirigida a",artesp
dataesp=pywikibot.ItemPage.fromPage(artesp)
qesp=dataesp.title()
print u"id de Wikidata:",qesp
diccesp[especie]=qesp
print diccesp
except pywikibot.NoPage:
print especie,u"no existeix"
qesp=u""
except pywikibot.InvalidTitle:
print especie,u"títol invàlid"
qesp=u""
esesp=False
if len(qesp)>1:
text=artesp.get()
if re.search(u"\{\{[Tt]axo(caixa|box)",text):
esesp=True
else:
esesp=False
print artesp,u"no té taxocaixa"
if "P31" in pagdata.claims and len(qesp)>1 and esesp:
print u"hi ha instància"
llistainst=[]
for clam in pagdata.claims['P31']:
llistainst.append(clam.getTarget())
#print u"municipi:",datamun,qmun
#print u"a Wikidata:",llistaadm
if dataesp in llistainst:
hihaespdata=True
#print u"ja hi ha aquesta espècie"
else:
hihaespdata=False
else:
hihaespdata=False
if len(qesp)>1 and hihaespdata==False and qitem<>qesp:
print especie,qesp
linia=u"{}\tP31\t{}\tS143\tQ199693".format(qitem,qesp)
print linia
resultat=resultat+u"\n"+linia
if template.has(u"prot"):
try:
prot=unicode(template.get("prot").value)
if len(prot)>1:
prot=prot.replace(u"\n",u"").strip()
else:
prot=u""
except AttributeError:
prot=u""
else:
prot=u""
if template.has(u"idprot"):
idprot=unicode(template.get("idprot").value)
try:
if len(idprot)>1:
idprot=idprot.replace(u"\n",u"").strip()
else:
idprot=u""
except AttributeError:
prot=u""
else:
idprot=u""
if template.has(u"idipa"):
idipa=unicode(template.get("idipa").value)
try:
if len(idprot)>1:
idipa=idipa.replace(u"\n",u"").strip()
else:
idipa=u""
except AttributeError:
idipa=u""
else:
idipa=u""
if template.has(u"bic"):
bic=unicode(template.get("bic").value)
try:
if len(bic)>1:
bic=bic.replace(u"\n",u"").strip()
else:
bic=u""
except AttributeError:
bic=u""
else:
bic=u""
if template.has(u"id"):
idd=unicode(template.get("id").value)
try:
if len(idd)>1:
idd=idd.replace(u"\n",u"").strip()
else:
idd=u""
except AttributeError:
idd=u""
else:
idd=u""
if classe==u"monument":
if len(prot)>1 and prot in diccprot.keys() and not u"Andorra" in origen and "P1435" not in pagdata.claims:
qprot=diccprot[prot]
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
elif len(prot)>1 and prot in diccprotand.keys() and u"Andorra" in origen and "P1435" not in pagdata.claims:
qprot=diccprotand[prot]
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
elif u"BIC:" in prot and not u"Andorra" in origen and "P1435" not in pagdata.claims:
qprot=u"Q23712"
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
if "P380" not in pagdata.claims and (prot==u"Cat." or prot==u"Inv.") and len(idd)>2:
if idd[:2]==u"PA":
linia=u'{}\tP380\t"{}"\tS143\tQ199693'.format(qitem,idd)
print linia
resultat=resultat+u"\n"+linia
if "P1600" not in pagdata.claims and len(idd)>4:
if idd[:4]==u"IPA-":
idipa=idd[4:]
linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idipa)
print linia
resultat=resultat+u"\n"+linia
hihaipadata=True
if "P1600" not in pagdata.claims and template.name.matches((u"Plantilla:Filera IPA",)):
if len(idurl)>2:
linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idurl)
print linia
resultat=resultat+u"\n"+linia
if "P808" not in pagdata.claims and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot) and len(idd)>5 and not u"Andorra" in origen:
if idd[:3]==u"RI-":
linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,idd)
print linia
resultat=resultat+u"\n"+linia
if "P808" not in pagdata.claims and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot or prot==u"") and len(bic)>5 and not u"Andorra" in origen:
if bic[:3]==u"RI-" and len(bic)>5:
linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,bic)
print linia
resultat=resultat+u"\n"+linia
if "P1586" not in pagdata.claims and prot==u"BCIN" and len(idprot)>3 and not u"Andorra" in origen:
if idprot[-3:]==u"-MH":
linia=u'{}\tP1586\t"{}"\tS143\tQ199693'.format(qitem,idprot)
print linia
resultat=resultat+u"\n"+linia
text=unicode(code)
if text<>text0:
text=text.replace(u"\n\n}}","\n}}")
if pagprova<>False:
desti=pagprova
sumaricopia=u"Robot copia [[{}]] per fer proves".format(pllista.title())
pagprova.put(text0,sumaricopia)
else:
desti=pllista
desti.put(text,u"Robot actualitza la llista a partir de Wikidata")
return resultat
# El programa comença aquí.
# Comença a llegir articles de les llistes
lloc=u"Llistes de patrimoni natural de Catalunya" #Llista o categoria a mirar
paginaunica=(u"Llista d" in lloc) #Ho endevina sol, però si no va, s'hi posa True si lloc és una llista de monuments, False si és una categoria de llistes
site=pywikibot.getSite('ca')
sitecommons=pywikibot.getSite('commons','commons')
repo = site.data_repository()
pagprova=False #pywikibot.Page(site,u"Usuari:PereBot/proves")
if paginaunica:
llista=pywikibot.Page(site,lloc)
print llista
l=[llista]
else:
l=catlib.Category(site,lloc).articlesList(recurse=True) #Canviar True/False segons convingui
#print l
vistos=[]
resum=u""
resumwiki=u""
comptador=0
comptatotal=len(l)
for llista in pagegenerators.PreloadingGenerator(l):
comptador=comptador+1
print comptador,u"/",comptatotal,llista
if llista.namespace()==0 and not llista in vistos:
vistos.append(llista)
infquick=actuallista(llista,pagprova)
#diccllegit=llegeixllista(llista)
#print diccllegit
#infquick,infwiki=comprova(diccllegit,llista.title())
#print infquick
resum=resum+infquick
#resumwiki=resumwiki+infwiki
print u"\nPer la wiki:"
#print resumwiki+u"\n"
print u"\nRESULTAT:"
print resum
pywikibot.stopme()
Versió que només puja
[modifica]Versió més antiga que només copia les dades de les llistes a Wikidata i que fa servir expressions regulars per llegir les llistes.
# -*- coding: utf-8 -*-
# Programa per pujar a Wikidata les dades dels monuments
# a partir de les llistes. Només puja les dades dels monuments amb
# article a cawiki.
# Puja commonscat, coordenades, foto, municipi (si el troba),
# estatus patrimonial i números de registre (si a Wikidata hi ha la propietat).
# El resultat es un codi per posar al quickstatements.
import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,json,pickle,math
# Elimina duplicats d'una llista
def unic(llista):
llistanova=[]
for el in llista:
if not el in llistanova:
llistanova.append(el)
return llistanova
# Elimina l'enllaç d'un text. Funciona bé si hi ha un sol enllaç.
# Deixa el text que mostra l'enllaç (no on apunta)
def eliminaenllac(nom):
nom=re.sub(u"\[\[.*\|","",nom)
nom=nom.replace("[[","")
nom=nom.replace("]]","")
return nom
def plant(tit):
return pywikibot.Page(site,u"Plantilla:{}".format(tit))
# Llegeix la llista de monuments sencera i retorna un diccionari
def llegeixllista(pag): ##,llistafotos,minfotos
origen=pag.title()
tottemp=pag.templatesWithParams()
llistatits=[]
informe=u"" # Descripcions de les categories a crear.
resumllista=u"" # Resum estadístic de les categories a crear per una llista.
numcats=0 # Comptador pel nombre de categories en una llista.
ccatllista=u"" # Categoria de Commons que correspon a la llista d'acord amb la plantilla Commonscat.
classe=u""
dicc={}
if False: #Codi anul·lat
if re.search("Catalunya Nord|Pirineus Orientals",origen):
regio=u"_region:FR-66"
elif re.search("Catalunya|Osona|Pallars|Terres de l'Ebre|Costa (Brava|Daurada)|Barcelon",origen):
regio=u"_region:ES-CT"
elif re.search("Val[eè]nci[aà]|Alacant|[Pp]rovíncia de Castelló|Costa (dels Tarongers|Blanca)",origen):
regio=u"_region:ES-CV"
elif re.search("Balears|Mallorca|Menorca|Eivissa|Formentera",origen):
regio=u"_region:ES-IB"
elif re.search("Andorra",origen):
regio=u"_region:AD"
else:
regio=u""
for i in range(0, len(tottemp)):
plantactual=tottemp[i][0].title()
#print plantactual
classe0=u""
if tottemp[i][0]==plant(u'Filera art públic'):
classe0=u"art"
if tottemp[i][0]==plant(u'Filera IPA') or tottemp[i][0]==plant(u'Filera MH') or tottemp[i][0]==plant(u'Filera BIC') or tottemp[i][0]==plant(u'Filera BIC Val') or tottemp[i][0]==plant(u'Filera BIC And') or tottemp[i][0]==plant(u'filera BC Sard') or tottemp[i][0]==plant(u'filera BIC-ZA'):
classe0=u"monument"
# print u"MONUMENT"
if tottemp[i][0]==plant(u'Filera patrimoni natural'):
classe0=u"natural"
if classe0!=u"":
classe=classe0
# print u"classe:",classe
# print tottemp[i][1]
proposta=""
nom=""
nomcoor=""
nomnet=""
lloc=""
municipi=""
lat=""
lon=""
prot=""
idd=""
idprot=""
codi=""
idurl=""
bic=""
imatge=""
autor=""
data=""
descripcio=""
material=""
enllacmaterial=""
commonscat=""
enllac=""
tipus=""
enllactipus=""
dimensions=""
coorddim=""
coordtype=""
#print tottemp[i][1]
for j in range(0,len(tottemp[i][1])): # llegeix la taula i n'extreu els camps
camp=tottemp[i][1][j].replace(u"\n","")
camp=camp.replace("<br/>",". ")
camp=camp.replace("<br />",". ")
camp=re.sub(u"<ref name.*>.*<.*>","",camp)
camp=re.sub(u"<ref ?>.*<.*>","",camp)
camp=re.sub(u"<.*>","",camp)
#print camp
if re.search(u"coord-nom *?=",camp):
nomcoor=re.sub(u"^ *?coord-nom *?= *?","",camp)
nomcoor=nomcoor.strip()
# print nomcoor
elif re.search(u"nom *?=",camp):
nom=re.sub(u" *?nom *?= *?","",camp)
nom=re.sub(u"<ref name.*>.*<.*>","",nom)
nom=re.sub(u"<ref ?>.*<.*>","",nom)
nom=re.sub(u"<.*>","",nom)
nom=nom.strip()
#print nom
if len(re.findall(u"\[\[",nom))>1:
print u"PERILL: 2 enllaços a",nom
if re.search(u"\[\[.*\]\]",nom):
enllac=re.sub(u"^.*?\[\[","",nom)
enllac=re.sub(u"\]\].*?$","",enllac)
enllac=re.sub(u"\|.*?$","",enllac)
nomnet=eliminaenllac(nom)
# print enllac
else:
nomnet=nom
elif re.search(u"nomcoor *?=",camp):
nomcoor=re.sub(u"^ *?nomcoor *?= *?","",camp)
nomcoor=nomcoor.strip()
# print nomcoor
elif re.search(u"municipi *?=",camp): #Compte que torna l'enllaç al municipi i no el text com altres versions de la funció
municipi=re.sub(u"^ *?municipi *?= *?","",camp)
municipi=municipi.strip()
#print municipi
if u"[[" in municipi:
if re.search(u"\[\[.*\]\]",municipi):
municipi=re.sub(u"^.*?\[\[","",municipi)
municipi=re.sub(u"\]\].*?$","",municipi)
municipi=re.sub(u"\|.*?$","",municipi)
municipi=eliminaenllac(municipi)
#print municipi
elif re.search(u"lloc *?=",camp):
lloc=re.sub(u"^ *?lloc *?= *?","",camp)
lloc=eliminaenllac(lloc)
lloc=lloc.strip()
# print lloc
elif re.search(u"lat *?=",camp):
lat=re.sub(u"^ *?lat *?= *?","",camp)
lat=lat.replace(" ","")
# print lat
elif re.search(u"lon *?=",camp):
lon=re.sub(u"^ *?lon *?= *?","",camp)
lon=lon.replace(" ","")
# print lon
elif re.search(u"idurl *?=",camp):
idurl=re.sub(u"^ *?idurl *?= *?","",camp)
idurl=idurl.replace(" ","")
# print idurl
elif re.search(u"id *?=",camp):
idd=re.sub(u"^ *?id *?= *?","",camp)
idd=idd.replace(" ","")
#print idd
elif re.search(u"prot *?=",camp) and not re.search(u"idprot *?=",camp):
prot=re.sub(u"^ *?prot *?= *?","",camp)
prot=prot.replace(" ","")
#print prot
elif re.search(u"idprot *?=",camp):
idprot=re.sub(u"^ *?idprot *?= *?","",camp)
idprot=idprot.replace(" ","")
#print idprot
elif re.search(u"bic *?=",camp):
bic=re.sub(u"^ *?bic *?= *?","",camp)
bic=bic.replace(" ","")
#print bic
elif re.search(u"descripció *?=",camp):
descripcio=re.sub(u"^ *?descripció *?= *?","",camp)
descripcio=descripcio.strip()
# print descripcio
elif re.search(u"codi *?=",camp):
codi=re.sub(u"^ *?codi *?= *?","",camp)
codi=codi.replace(" ","")
# print codi
elif re.search(u"data *?=",camp):
data=re.sub(u"^ *?data *?= *?","",camp)
data=data.strip()
# print data
elif re.search(u"material *?=",camp):
material=re.sub(u"^ *?material *?= *?","",camp)
material=eliminaenllac(material)
material=material.strip()
# print material
if len(re.findall(u"\[\[",material))>1:
print u"PERILL: 2 enllaços a",material
if re.search(u"\[\[.*\]\]",tipus):
enllacmaterial=re.sub(u"^.*?\[\[","",material)
enllacmaterial=re.sub(u"\]\].*?$","",enllacmaterial)
enllacmaterial=re.sub(u"\|.*?$","",enllacmaterial)
# print enllacmaterial
elif re.search(u"autor *?=",camp):
autor=re.sub(u"^ *?autor *?= *?","",camp)
autor=eliminaenllac(autor)
autor=autor.strip()
# print autor
elif re.search(u"imatge *?=",camp):
imatge=re.sub(u"^ *?imatge *?= *?","",camp)
imatge=imatge.strip()
if not(re.search(u"..",imatge)):
imatge=""
# print imatge
elif re.search(u"commonscat *?=",camp):
commonscat=re.sub(u"^ *?commonscat *?= *?","",camp)
commonscat=commonscat.strip()
if not(re.search(u"..",commonscat)):
commonscat=""
# print commonscat
elif re.search(u"tipus *?=",camp):
tipus=re.sub(u"^ *?tipus *?= *?","",camp)
tipus=tipus.strip()
if not(re.search(u"..",tipus)):
tipus=""
# print tipus
if len(re.findall(u"\[\[",tipus))>1:
print u"PERILL: 2 enllaços a",tipus
if re.search(u"\[\[.*\]\]",tipus):
enllactipus=re.sub(u"^.*?\[\[","",tipus)
enllactipus=re.sub(u"\]\].*?$","",enllactipus)
enllactipus=re.sub(u"\|.*?$","",enllactipus)
# print enllactipus
elif re.search(u"coord-dim *?=",camp):
coorddim=re.sub(u"^ *?coord-dim *?= *?","",camp)
coorddim=coorddim.strip()
if not(re.search(u"..",coorddim)):
coorddim=""
# print coorddim
elif re.search(u"coord-type *?=",camp):
coordtype=re.sub(u"^ *?coord-type *?= *?","",camp)
coordtype=coordtype.strip()
if not(re.search(u"..",coordtype)):
coordtype=""
# print coordtype
if (classe0=="art" or classe0=="monument") and coordtype=="":
coordtype="landmark"
## numfotos=llistafotos.count(idd)
# print nomcoor ##+": "+'{:}'.format(numfotos)+" fotos"
if u"#" in enllac:
#enllac=re.split(u"#",enllac)[0]
print u"Ignorat enllaç",enllac
enllac=u""
if enllac<>u"":
#enllac=enllac[0].upper()+enllac[1:] #Anul·lat perquè ja normalitzarà l'API
llistatits.append(enllac)
dicc[enllac]={"classe":classe,"lat":lat,"lon":lon,"ccat":commonscat,"municipi":municipi,"prot":prot,u"idd":idd,u"idprot":idprot,"bic":bic,"idurl":idurl,"imatge":imatge,"enllactipus":enllactipus,"enllacmaterial":enllacmaterial,"filera":plantactual}
#print dicc
#print llistatits
#print dicc
return dicc
def comprova(dicc,origen=u""):
diccprot={u"BIC":u"Q23712",u"BRL":u"Q11910247",u"BCIN":u"Q1019352",u"BCIL":u"Q11910250"}
diccprot[u"BCIN-ZA"]=u"Q1019352"
diccprot[u"PH.BCIN"]=u"Q1019352"
diccprot[u"Inv."]=u"Q10387575"
diccprot[u"Cat."]=u"Q10387684"
diccprotand={u"BIC":u"Q5004973",u"BI":u"Q21095081"}
resultat=u""
diccmunicipis={}
diccesp={}
for enllac in dicc.keys():
classe=dicc[enllac]["classe"]
lat=dicc[enllac]["lat"]
lon=dicc[enllac]["lon"]
ccat=dicc[enllac]["ccat"]
prot=dicc[enllac]["prot"]
municipi=dicc[enllac]["municipi"]
idd=dicc[enllac]["idd"]
idprot=dicc[enllac]["idprot"]
bic=dicc[enllac]["bic"]
idurl=dicc[enllac]["idurl"]
imatge=dicc[enllac]["imatge"]
enllactipus=dicc[enllac]["enllactipus"]
enllacmaterial=dicc[enllac]["enllacmaterial"]
filera=dicc[enllac]["filera"]
pag=pywikibot.Page(site,enllac)
try:
text=pag.get()
except pywikibot.NoPage:
continue
except pywikibot.IsRedirectPage:
pag=pag.getRedirectTarget()
try:
text=pag.get()
except pywikibot.NoPage:
continue
except pywikibot.IsRedirectPage:
print pag,u"doble redirecció"
continue
except pywikibot.InvalidTitle:
print u"títol invàlid"
continue
cats=pag.categories()
print pag
esmon=False
esart=False
esnat=False
for cat in cats:
ticat=cat.title()
#print ticat
if re.search(u"Categoria:(Monuments|Patrimoni monumental|Béns (Culturals|d'Interès))",ticat) and not re.search(u"Categoria:Llistes",ticat):
esmon=True
if re.search(u"Categoria:(Escultures)",ticat) and not re.search(u"Categoria:Llistes",ticat):
esart=True
if re.search(u"Categoria:(Muntanyes|Arbres|Platges|Estanys|Hàbitats|Parc|Volcans|Espais|Reserves|Rius|Rieres|Boscs|Zones humides|Illes|Illots|Coves|Jaciment|Arxipèlags|Paratges|.* individuals)",ticat) and not re.search(u"Categoria:Llistes",ticat):
esnat=True
if esmon==False and classe==u"monument":
print pag,u"monument sense categories de monuments"
continue
if esart==False and esmon==False and classe==u"art":
print pag,u"art públic sense categories de monuments ni d'art"
continue
if esnat==False and classe==u"natural":
print pag,u"natural sense categories de natural"
continue
#plants=pag.templates()
#print plants
#if plant(u"commonscat") in plants:
# print u"ja hi ha Commonscat"
#if plant (u"coord") in plants:
# print u"ja hi ha Coord"
try:
pagdata=pywikibot.ItemPage.fromPage(pag)
cont=pagdata.get()
except NotImplementedError:
print u"NotImplementedError: (possiblement detecta unitats)"
continue
except pywikibot.NoPage:
print u"No hi ha pàgina a Wikidata"
continue
qitem=pagdata.title()
print u"id de Wikidata:",qitem
hihaccatdata=False
hihacoordata=False
hihapatrdata=False
hihamerimdata=False
hihaipadata=False
hihabcindata=False
hihabicdata=False
hihamundata=False
hihaespdata=False
hihaimatgedata=False
qmun=u""
for prop in cont["claims"]:
#print u"PROP:",prop
if prop=="P373":
#print u"ja hi ha commonscat"
hihaccatdata=True
elif prop=="P625":
#print u"ja hi ha coordenades"
hihacoordata=True
elif prop=="P1435":
#print u"ja hi ha status patrimonial"
hihapatrdata=True
elif prop=="P380":
#print u"ja hi ha identificador Merimée"
hihamerimdata=True
elif prop=="P1600":
#print u"ja hi ha identificador IPAC"
hihaipadata=True
elif prop=="P1586":
#print u"ja hi ha identificador BCIN"
hihabcindata=True
elif prop=="P808":
#print u"ja hi ha identificador BIC"
hihabicdata=True
elif prop=="P18":
#print u"ja hi ha imatge"
hihaimatgedata=True
nocommons=False
if len(ccat)>0 and hihaccatdata==False:
titccat=u"Category:{}".format(ccat)
try:
catcommons=pywikibot.Page(sitecommons,titccat) #catlib.Category(sitecommons,ccat)
except ValueError:
print u"value error"
nocommons=True
continue
except pywikibot.InvalidTitle:
print u"títol invàlid"
nocommons=True
continue
if nocommons==False:
try:
text=catcommons.get()
except pywikibot.NoPage:
nocommons=True
if nocommons==False:
linia=u'{}\tP373\t"{}"\tS143\tQ199693'.format(qitem,ccat)#commonscat
print linia
resultat=resultat+u"\n"+linia
if len(lat)>0 and len(lon)>0 and hihacoordata==False:
linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,lat,lon)
print linia
resultat=resultat+u"\n"+linia
textmunicipi=u""
if len(municipi)>0:
if municipi in diccmunicipis.keys():
qmun=diccmunicipis[municipi]
datamun=pywikibot.ItemPage(repo,qmun)
else:
artmun=pywikibot.Page(site,municipi)
try:
try:
textmunicipi=artmun.get()
except pywikibot.IsRedirectPage:
artmun=artmun.getRedirectTarget()
textmunicipi=artmun.get()
except pywikibot.NoPage:
print u"Error municipi:",municipi,u"no existeix"
qmun=u""
except pywikibot.InvalidTitle:
print u"Error municipi:",municipi,u"títol invàlid"
qmun=u""
if re.search(u"\{\{[Ii]nfotaula( del?)? (municipi|parròquia)",textmunicipi):
datamun=pywikibot.ItemPage.fromPage(artmun)
qmun=datamun.title()
print u"id de Wikidata:",qmun
diccmunicipis[municipi]=qmun
#print diccmunicipis
else:
print u"Error municipi:",municipi,u"no té infotaula de municipi"
qmun=u""
except pywikibot.NoPage:
print u"Error municipi:",municipi,u"no existeix"
qmun=u""
except pywikibot.InvalidTitle:
print u"Error municipi:",municipi,u"títol invàlid"
qmun=u""
if "P131" in pagdata.claims and len(qmun)>1:
#print u"hi ha entitat administrativa"
llistaadm=[]
for clam in pagdata.claims['P131']:
llistaadm.append(clam.getTarget())
#print u"municipi:",datamun,qmun
#print u"a Wikidata:",llistaadm
if datamun in llistaadm:
hihamundata=True
#print u"ja hi ha aquest municipi"
else:
hihamundata=False
else:
hihamundata=False
if len(qmun)>1 and hihamundata==False and qitem<>qmun:
print municipi,qmun
linia=u"{}\tP131\t{}\tS143\tQ199693".format(qitem,qmun)
print linia
resultat=resultat+u"\n"+linia
if len(enllactipus+enllacmaterial)>0 and u"arbres" in origen: #espècies
if len(enllactipus)==0:
especie=enllacmaterial
else:
especie=enllactipus
if especie in diccesp.keys():
qesp=diccesp[especie]
dataesp=pywikibot.ItemPage(repo,qesp)
else:
artesp=pywikibot.Page(site,especie)
try:
if artesp.isRedirectPage():
print artesp,u"redirecció"
artesp=artesp.getRedirectTarget()
print u"redirigida a",artesp
dataesp=pywikibot.ItemPage.fromPage(artesp)
qesp=dataesp.title()
print u"id de Wikidata:",qesp
diccesp[especie]=qesp
print diccesp
except pywikibot.NoPage:
print especie,u"no existeix"
qesp=u""
except pywikibot.InvalidTitle:
print especie,u"títol invàlid"
qesp=u""
esesp=False
if len(qesp)>1:
text=artesp.get()
if re.search(u"\{\{[Tt]axo(caixa|box)",text):
esesp=True
else:
esesp=False
print artesp,u"no té taxocaixa"
if "P31" in pagdata.claims and len(qesp)>1 and esesp:
print u"hi ha instància"
llistainst=[]
for clam in pagdata.claims['P31']:
llistainst.append(clam.getTarget())
#print u"municipi:",datamun,qmun
#print u"a Wikidata:",llistaadm
if dataesp in llistainst:
hihaespdata=True
#print u"ja hi ha aquesta espècie"
else:
hihaespdata=False
else:
hihaespdata=False
if len(qesp)>1 and hihaespdata==False and qitem<>qesp:
print especie,qesp
linia=u"{}\tP31\t{}\tS143\tQ199693".format(qitem,qesp)
print linia
resultat=resultat+u"\n"+linia
if hihaimatgedata==False and len(imatge)>4:
linia=u'{}\tP18\t"{}"\tS143\tQ199693'.format(qitem,imatge)
print linia
resultat=resultat+u"\n"+linia
if classe==u"monument":
if len(prot)>1 and prot in diccprot.keys() and not u"Andorra" in origen and hihapatrdata==False:
qprot=diccprot[prot]
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
elif len(prot)>1 and prot in diccprotand.keys() and u"Andorra" in origen and hihapatrdata==False:
qprot=diccprotand[prot]
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
elif u"BIC:" in prot and not u"Andorra" in origen and hihapatrdata==False:
qprot=u"Q23712"
print prot,qprot
linia=u"{}\tP1435\t{}\tS143\tQ199693".format(qitem,qprot)
print linia
resultat=resultat+u"\n"+linia
if hihamerimdata==False and (prot==u"Cat." or prot==u"Inv.") and len(idd)>2:
if idd[:2]==u"PA":
linia=u'{}\tP380\t"{}"\tS143\tQ199693'.format(qitem,idd)
print linia
resultat=resultat+u"\n"+linia
if hihaipadata==False and len(idd)>4:
if idd[:4]==u"IPA-":
idipa=idd[4:]
linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idipa)
print linia
resultat=resultat+u"\n"+linia
hihaipadata=True
if hihaipadata==False and filera==u"Plantilla:Filera IPA":
if len(idurl)>2:
linia=u'{}\tP1600\t"{}"\tS143\tQ199693'.format(qitem,idurl)
print linia
resultat=resultat+u"\n"+linia
if hihabicdata==False and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot) and len(idd)>5 and not u"Andorra" in origen:
if idd[:3]==u"RI-":
linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,idd)
print linia
resultat=resultat+u"\n"+linia
if hihabicdata==False and (prot==u"BIC" or prot==u"BCIN" or u"BIC:" in prot or prot==u"") and len(bic)>5 and not u"Andorra" in origen:
if bic[:3]==u"RI-" and len(bic)>5:
linia=u'{}\tP808\t"{}"\tS143\tQ199693'.format(qitem,bic)
print linia
resultat=resultat+u"\n"+linia
if hihabcindata==False and prot==u"BCIN" and len(idprot)>3 and not u"Andorra" in origen:
if idprot[-3:]==u"-MH":
linia=u'{}\tP1586\t"{}"\tS143\tQ199693'.format(qitem,idprot)
print linia
resultat=resultat+u"\n"+linia
return resultat
# El programa comença aquí.
# Comença a llegir articles de les llistes
lloc=u"Llistes de monuments de les Terres de l'Ebre" #Llista o categoria a mirar
paginaunica=(u"Llista d" in lloc) #Ho endevina sol, però si no va, s'hi posa True si lloc és una llista de monuments, False si és una categoria de llistes
site=pywikibot.getSite('ca')
sitecommons=pywikibot.getSite('commons','commons')
repo = site.data_repository()
if paginaunica:
llista=pywikibot.Page(site,lloc)
print llista
l=[llista]
else:
l=catlib.Category(site,lloc).articlesList(recurse=True) #Canviar True/False segons convingui
#print l
vistos=[]
resum=u""
comptador=0
comptatotal=len(l)
for llista in pagegenerators.PreloadingGenerator(l):
comptador=comptador+1
print comptador,u"/",comptatotal,llista
if llista.namespace()==0 and not llista in vistos:
vistos.append(llista)
diccllegit=llegeixllista(llista)
#print diccllegit
infquick=comprova(diccllegit,llista.title())
print infquick
resum=resum+infquick
print u"\nRESULTAT:"
print resum
pywikibot.stopme()