Usuari:PereBot/robot llista GEC

De la Viquipèdia, l'enciclopèdia lliure

Programes que comparen els títols dels articles de la Viquipèdia i de l'Enciclopèdia Catalana enllaçats d'un mateix element de Wikidata. L'objectiu principal és trobar els articles mal enllaçats. La llista és a Usuari:PereBot/manteniment Wikidata/Gran Enciclopèdia Catalana.

La versió ràpida fa servir diferents consultes (incloent una als resultats anteriors obtinguts amb la versió lenta). La versió lenta llegeix un a un els elements de Wikidata i els articles de l'Enciclopèdia per obtenir els títols, i en general més molt menys recomanable (triga una pila d'hores en comptes de molt pocs minuts).

Versió ràpida[modifica]

# -*- coding: utf-8 -*-

import sys
sys.path.append('C:\compat')
sys.path.append('C:\compat\userinterfaces')
import catlib,pagegenerators,re,urllib,urllib2,json,wikipedia

# El programa comença aquí
cawiki=wikipedia.getSite('ca')
site=cawiki
# Llegeix relació idwikidata-idgec
consulta="https://wdq.wmflabs.org/api?q=CLAIM[1296]%20and%20LINK[cawiki]&props=1296"
pcons=urllib.urlopen(consulta)
print "obert"
tcons=pcons.read()
print "llegit"
jcons=json.loads(tcons)
idgecs={}
for el in jcons["props"]["1296"]:
    idgecs[el[0]]=el[2]
    #print el[0],el[2]
#print idgecs
# Llegeix relació idwikidata-títolcawiki
comptabloc=0
comptador=0
numarts=len(jcons["items"])
sqids=""
titcawiki={}
for idw in jcons["items"]:#[:1000]: #Anul·lar amb [] o [:500]: per proves
    comptabloc=comptabloc+1
    comptador=comptador+1
    sqids=sqids+"|Q{}".format(idw)
    if comptabloc>49 or comptador==numarts:
        sqids=sqids[1:]
        print sqids
        consulta="http://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids={}&sites=cawiki&props=sitelinks&languages=ca&sitefilter=cawiki".format(sqids)
        pcons=urllib.urlopen(consulta)
        print "obert"
        tcons=pcons.read()
        print "llegit"
        jtits=json.loads(tcons)
        #print jtits
        for item in jtits["entities"].keys():
            idwd=int(item[1:])
            try:
                titca=jtits["entities"][item]["sitelinks"]["cawiki"]["title"]
            except KeyError:
                print item,u"no té interviqui"
                titca="sense article a cawiki"
            print comptador,u"/",numarts,idwd,titca
            titcawiki[idwd]=titca        
        comptabloc=0
        sqids=""
#print titcawiki
# Llegeix relació idgec-títolgec
print u"buscant arxiugec"
arxiugec=wikipedia.Page(cawiki,u"Usuari:PereBot/manteniment Wikidata/Gran Enciclopèdia Catalana/arxiu1")
textpag=arxiugec.get()
troba=re.findall(u"\[http://www\.enciclopedia\.cat/EC-GEC-([0-9]*?)\.xml (.*?)\]",textpag)
#print troba
print u"llegit arxiugec"
titgecs={}
for parell in troba:
    titgecs[parell[0]]=parell[1]
#print titgecs
print u"trobats titgecs"
# Comença a comparar
paginforme=wikipedia.Page(site,u"Usuari:PereBot/manteniment Wikidata/Gran Enciclopèdia Catalana")
text0=paginforme.get()
capinforme=u"\n==Viquipèdia i Gran Enciclopèdia Catalana==\n\n"
informedif=u"===Noms diferents===\n\n"
informeiguals=u"===Noms iguals===\n\n"
informepart=u"===Noms amb partícules diferents===\n\n"
informeerrors=u"===Errors i articles no trobats===\n\n"
comptador=0
comptabloc=80
primer=True
saltar=0 #Per saltar-se els primers
for idwd in idgecs.keys()[saltar:]:
    if primer==True:
        primer=False
        if saltar>0:
            capinforme=capinforme.replace("==\n\n"," (continuació)==\n\n")
    comptador=comptador+1
    comptabloc=comptabloc+1
    titdata=u"Q{}".format(idwd)
    try:
        titca=titcawiki[idwd]
    except KeyError:
        titca=u"sense enllaç cawiki"
    try:
        idgec=idgecs[idwd]
    except KeyError:
        idgec=u"sense indentificador gec"
    try:
        titgec=titgecs[idgec]
    except KeyError:
        titgec=u"títol gec desconegut"
        if idgec==u"sense indentificador gec":
            titgec=idgec
        else:
            #Busquem el títol a la GEC si no el sabem
            urlgec="http://www.enciclopedia.cat/EC-GEC-{}.xml".format(idgec)
            print comptador,u"buscant",titca,u"a",urlgec
            try:
                pgec=urllib.urlopen(urlgec)
            except IOError:
                print "Error IO en obrir",urlgec
                pgec=u"Error o títol no determinat"
            #print "obert"
            if pgec==u"Error o títol no determinat":
                titgec=pgec
            else:
                tgec=pgec.read()
                try:
                    titgec=re.findall(u'<meta content="(.*)" about',tgec)[0]
                except IndexError:
                    titgec=u"Error o títol no determinat"
                print type(titgec)
                titgec=unicode(titgec,'utf-8')
                titgecs[idgec]=titgec
    print titca,idgec,titgec
    #print type(titca),type(idgec),type(titgec)
    stitca=titca #titca.encode('utf-8')
    stitcacomp=re.sub(u" \(.*\)",u"",titca) #.encode('utf-8')
    #print comptador,titca,titgec
    #print comptador,stitca,titgec
    print comptador,u"wp:{}, gec:{}".format(titca,titgec)
    iguals=(stitcacomp.lower()==titgec.lower().replace(u"’",u"'"))
    urlgec="http://www.enciclopedia.cat/EC-GEC-{}.xml".format(idgec)
    linia=u"# '''[[{}]]''': [{} {}]; ''[[d:{}]]''\n".format(stitca,urlgec,titgec,titdata)
    if iguals:
        informeiguals=informeiguals+linia
    elif titgec==u"Error o títol no determinat" or titgec==u"sense indentificador gec" or titgec==u"Pàgina no disponible":
        informeerrors=informeerrors+linia
    else:
        stitcanopart=re.sub(u" . | .. ",u" ",stitcacomp)
        titgecnopart=re.sub(u" . | .. ",u" ",titgec)
        iguals=(stitcanopart.lower()==titgecnopart.lower().replace(u"’",u"'"))
        if iguals:
            informepart=informepart+linia
        else:    
            informedif=informedif+linia       
    if comptabloc>4000:
        informe=capinforme+informepart+informedif+informeerrors+informeiguals
        paginforme.put(text0+informe,u"Comparant títols de la Viquipèdia i la Gran Enciclopèdia Catalana")
        comptabloc=0
informe=capinforme+informedif+informepart+informeerrors+informeiguals
paginforme.put(text0+informe+u"--~~~~\n\n",u"Comparant títols de la Viquipèdia i la Gran Enciclopèdia Catalana")
wikipedia.stopme()

Versió lenta[modifica]

# -*- coding: utf-8 -*-

import sys
sys.path.append('C:\compat')
sys.path.append('C:\compat\userinterfaces')
import wikipedia,catlib,pagegenerators,re,urllib,urllib2,json

# El programa comença aquí
sitedata=wikipedia.getSite('wikidata','wikidata')
site=wikipedia.getSite('ca')
paginforme=wikipedia.Page(site,u"Usuari:PereBot/manteniment Wikidata/Gran Enciclopèdia Catalana")
if paginforme.exists():
    text0=paginforme.get()
else:
    text0=""
capinforme="\n==Viquipèdia i Gran Enciclopèdia Catalana==\n\n"
informedif="===Noms diferents===\n\n"
informeiguals="===Noms iguals===\n\n"
consulta="http://wdq.wmflabs.org/api?q=CLAIM[1296]"
pcons=urllib.urlopen(consulta)
print "obert"
tcons=pcons.read()
print "llegit"
jcons=json.loads(tcons)
comptador=0
comptabloc=80
primer=True
saltar=3825 #Per saltar-se els primers
for idd in jcons["items"][saltar:]:
    if primer==True:
        primer=False
        if saltar>0:
            capinforme=capinforme.replace("==\n\n"," (continuació)==\n\n")
    comptador=comptador+1
    comptabloc=comptabloc+1
    print idd
    titdata="Q{}".format(idd)
    titca=u""
    idgec=u""
    try:
        pagdata=wikipedia.DataPage(sitedata,title=titdata)
        #print pagdata
        cont=pagdata.get()
        #print cont
        titca=cont[u'links'][u'cawiki'][u'name']
        #print titca
        claims=cont[u'claims']
        for claim in claims:
            num=claim["m"][1]
            if num==1296:
                #print claim
                idgec=claim["m"][3]
    except IndexError:
        print u"Error: paràmetre sense contingut a wikidata"
        ccat=u""
    except wikipedia.NoPage:
        print u"Error: no hi ha pàgina a wikidata"
    except wikipedia.MaxTriesExceededError:
        print u"Error: Temps excedit"
    except urllib2.HTTPError:
        print u"Error HTTP (no deu funcionar el web)"
    except KeyError:
        print "KeyError: no hi deu haver interviquis o claims"
    #except TypeError:
    #    print "TypeError: no hi deu haver interviquis"
    if titca==u"":
        print u"Sense iw català"
        continue
    elif idgec==u"":
        print u"Sense enllaç GEC"
        continue
    urlgec="http://www.enciclopedia.cat/EC-GEC-{}.xml".format(idgec)
    #print comptador,titca,urlgec
    try:
        pgec=urllib.urlopen(urlgec)
    except IOError:
        print "Error IO en obrir",urlgec
        continue
    #print "obert"
    tgec=pgec.read()
    try:
        titgec=re.findall(u'<meta content="(.*)" about',tgec)[0]
    except IndexError:
        titgec="Error o títol no determinat"
    #print type(titca),type(titgec)
    #print " gec:{}".format(titgec)
    stitca=titca.encode('utf-8')
    stitcacomp=re.sub(u" \(.*\)",u"",titca).encode('utf-8')
    print comptador,"wp:{}, gec:{}".format(stitca,titgec)
    iguals=(stitcacomp.lower()==titgec.lower().replace("’","'"))
    linia="# '''[[{}]]''': [{} {}]; ''[[d:{}]]''\n".format(stitca,urlgec,titgec,titdata)
    if iguals:
        informeiguals=informeiguals+linia
    else:
        informedif=informedif+linia       
    if comptabloc>120:
        informe=capinforme+informedif+informeiguals
        paginforme.put(text0+unicode(informe,'utf-8'),u"Comparant títols de la Viquipèdia i la Gran Enciclopèdia Catalana")
        comptabloc=0
informe=capinforme+informedif+informeiguals
paginforme.put(text0+unicode(informe,'utf-8')+u"--~~~~\n\n",u"Comparant títols de la Viquipèdia i la Gran Enciclopèdia Catalana")
wikipedia.stopme()