Usuari:PereBot/robot puja coordenades a Wikidata
Aparença
# -*- coding: utf-8 -*-
# Programa per preparar l'escript per pujar a Wikidata les coordenades.
# Les instruccions les imprimeix a la pantalla per copiar-les i enganxar-les
# al Quickstatements.
import sys
sys.path.append('C:\compat')
sys.path.append('C:\compat\userinterfaces')
import wikipedia,catlib,re,pagegenerators
import re
#El programa comença aquí
site=wikipedia.getSite('ca')
cat=catlib.Category(site,u"Articles amb coordenades sense coordenades a Wikidata")
arts=cat.articlesList(recurse=False)
resultat=u""
for pag in pagegenerators.PreloadingGenerator(arts):
print pag.title()
text=pag.get()
textm=text.lower()
if u'Infotaula patrimoni cultural' in pag.templates():
trobats=re.findall(u"((lat|long)_dec.*?(\n|\|))",text)
print trobats
lat=False
lon=False
for tros in trobats:
#print tros
tros=tros[0]
tros=tros.replace(u"<!--coordenades de patmapa ajustades automàticament-->",u"")
#print tros
numtext=re.sub(u"[long_decat \|\n\r\t=]",u"",tros)
#print numtext
if u"lat_dec" in tros:
lat=numtext
if u"long_dec" in tros:
lon=numtext
print lat,lon
elif u'Infotaula de teatre' in pag.templates():
trobats=re.findall(u"((latitud|longitud).*?(\n|\|))",text)
print trobats
lat=False
lon=False
for tros in trobats:
#print tros
tros=tros[0]
tros=tros.replace(u"<!--coordenades de patmapa ajustades automàticament-->",u"")
#print tros
numtext=re.sub(u"[longituda \|\n\r\t=]",u"",tros)
#print numtext
if u"latitud" in tros:
lat=numtext
if u"longitud" in tros:
lon=numtext
print lat,lon
elif u'VPHISMILCAT Localització militar' in pag.templates() or u'Localització militar' in pag.templates():
trobats=re.findall(u"((lat|long?)_(deg|min|seg).*?(\n|\|))",text)
print trobats
lat=0
lon=0
for tros in trobats:
deltalon=0
deltalat=0
#print tros
tros=tros[0]
#print tros
numtext=re.sub(u"[long_decatmis \|\n\r\t=]",u"",tros)
print numtext
if not re.search(u"[0-9]",numtext):
numtext=u"0"
print numtext
if u"lat_deg" in tros:
deltalat=float(numtext)
if u"lon_deg" in tros:
deltalon=float(numtext)
if u"lat_min" in tros:
deltalat=float(numtext)/60
if u"lon_min" in tros:
deltalon=float(numtext)/60
if u"lat_seg" in tros:
deltalat=float(numtext)/3600
if u"lon_seg" in tros:
deltalon=float(numtext)/3600
if lon<0 and deltalon>0:
deltalon=-deltalon
if lat<0 and deltalat>0:
deltalat=-deltalat
if lon>0 and deltalon<0:
lon=-lon
if lat>0 and deltalat<0:
lat=-lat
lat=lat+deltalat
lon=lon+deltalon
print lat,lon
elif u'Coord' in pag.templates():
if re.search(u"\{\{ ?[Cc]oord ?\|",text):
print u"Confirmat que hi ha la plantilla coord"
else:
print u"PROBLEMA: Hi ha la plantilla coord però no la troba"
continue
if re.search(u"\[\[categoria ?: ?(muntanyes|serres|platges|ries|llacs|embassaments)",textm):
pass
elif re.search(u"\[\[categoria ?: ?((arque)?bisbats|ciutats|barris|entitats de població|municipis|prefectures|estats)",textm):
pass
elif re.search(u"\[\[categoria ?: ?(castells|esglésies|edificis|molins|masies|possessions|teatres|cementiris)",textm):
pass
elif re.search(u"\[\[categoria ?: ?(places|jaciments|zones|monuments|patrimoni monumental|creus de terme)",textm):
pass
elif re.search(u"\[\[categoria ?: ?(rius|rieres|torrets|cursos d'aigua|corrents d'aigua)",textm): #Aquests es posen segons si hi ha desembocadura a Wikidata
pass
elif u'Indret' in pag.templates() or u'Platja' in pag.templates():
pass
elif u"Infotaula patrimoni cultural" in pag.templates() or u"Infotaula d'espais naturals" in pag.templates():
pass
else:
print u"No té les categories previstes per buscar coordenades"
continue
trobats=re.findall(u"\{\{ ?[Cc]oord ?\|.*\}\}",text)
print trobats
trossos=re.split(u"\|",trobats[0].replace(u"}}",u""))
print trossos
if len(trossos)>=9:
if re.search(u"N",trossos[4]):
slat=1
elif re.search(u"S",trossos[4]):
slat=-1
else:
slat=0
if re.search(u"E",trossos[8]):
slon=1
elif re.search(u"[OW]",trossos[8]):
slon=-1
else:
slon=0
else:
slon=slat=0
if slon*slat<>0:
try:
lat=float(trossos[1])+float(trossos[2])/60+float(trossos[3])/3600
lon=float(trossos[5])+float(trossos[6])/60+float(trossos[7])/3600
lat=lat*slat
lon=lon*slon
except ValueError:
print u"Coordenades amb valors no numèrics"
continue
else:
if len(trossos)>=7:
if re.search(u"N",trossos[3]):
slat=1
elif re.search(u"S",trossos[3]):
slat=-1
else:
slat=0
if re.search(u"E",trossos[6]):
slon=1
elif re.search(u"[OW]",trossos[6]):
slon=-1
else:
slon=0
if slon*slat<>0:
try:
lat=float(trossos[1])+float(trossos[2])/60
lon=float(trossos[4])+float(trossos[5])/60
lat=lat*slat
lon=lon*slon
except ValueError:
print u"Coordenades amb valors no numèrics"
continue
else:
if len(trossos)>=5:
if re.search(u"N",trossos[2]):
slat=1
elif re.search(u"S",trossos[2]):
slat=-1
else:
slat=0
if re.search(u"E",trossos[4]):
slon=1
elif re.search(u"[OW]",trossos[4]):
slon=-1
else:
slon=0
if slon*slat<>0:
try:
lat=float(trossos[1])
lon=float(trossos[3])
lat=lat*slat
lon=lon*slon
except ValueError:
print u"Coordenades amb valors no numèrics"
continue
else:
if len(trossos)>=3:
if len(trossos)>3:
try:
nores=float(trossos[3])
print "tercer valor numèric. coordenades amb format no previst."
continue
except ValueError:
pass
try:
lat=float(trossos[1])
lon=float(trossos[2])
except ValueError:
print u"Coordenades amb valors no numèrics"
continue
else:
print u"Coordenades amb format no previst"
continue
else: #No és un dels articles on té previst buscar coordenades
continue
if lat==False or lon==False:
print "no trobades latitud i longitud"
continue
try:
pagdata=wikipedia.DataPage(pag)
cont=pagdata.get()
#print cont
except wikipedia.NoPage:
print u"No hi ha pàgina a Wikidata"
continue
qitem=pagdata.title()
print u"id de Wikidata:",qitem
hihacoord=False
numcoord=0
for prop in cont["claims"]:
#print u"PROP:",prop
#print u"M:",prop["m"]
print u"P:",prop["m"][1]
if prop["m"][1]==625:
print u"ja hi ha coordenades a Wikidata"
hihacoord=True
numcoord=numcoord+1
if prop["m"][1]==403:
print u"hi ha desembocadura"
continue
if prop["m"][1]==159:
print u"hi ha ubicació de la seu"
continue
if prop["m"][1]==279:
print u"és subclasse" #ERROR A MARCAR
continue
if hihacoord:
if numcoord>1:
print u"[[d:{}]] ([[{}]]) té coordenades duplicades".format(qitem,pag.title()) #ERROR A MARCAR
continue
linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,lat,lon)
print linia
resultat=resultat+u"\n"+linia
print u"Resultat:"
print resultat
wikipedia.stopme()