Usuari:PereBot/robot interseca categories
Aparença
# -*- coding: utf-8 -*-
# Programa per intersecar categories.
# Feu servir les funcions totcat, interseca i neteja
# per efectuar operacions amb categories.
import re, sys
sys.path.append('C:\pywikipedia')
import wikipedia, catlib, pagegenerators
# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat, catprevies=[], filtre=u""):
articles = cat.articlesList(recurse=False)
categories = cat.subcategoriesList(recurse=False)
for scat in categories:
print scat
# print u"Títol",scat.title()
if scat not in catprevies:
catprevies.append(scat)
if filtre == u"":
nopassa = False
print u"Filtre desactivat"
else:
nopassa = re.search(filtre, scat.title())
if not nopassa:
print u"Sí que es llegeix %s" % scat
noucats, nouarts = miracatfiltre(scat, catprevies+categories, filtre)
categories += noucats
articles += nouarts
else:
print u"No es llegeix %s" % scat
else:
print u"Aquesta ja la tinc vista"
articles = catlib.unique(articles)
return categories, articles
# Transforma el caràcter inicial [Xx] (per fer expressions regulars acceptant
# majúscula i minúscula)
def inicialcaixa(text):
inicial = text[0]
inicial = u"[{}{}]".format(inicial.upper(),inicial.lower())
return inicial+text[1:]
# Patró per a l'expressió regular del codi per una categoria
def catreg(nom):
return u"\[\[ *[Cc]ategoria *: *%s *(]]|\|)" % inicialcaixa(nom)
# Patró per a l'expressió regular del codi per una categoria
def catregesborra(nom):
return u"\[\[ *[Cc]ategoria *: *%s *(\|.*)?]]\n?" % inicialcaixa(nom)
# Treu en una pàgina les categories c1 i c2 i hi posa la cd
# Els arguments són el text de la pàgina i els noms de les categories
# (sense "Categoria:").
def canviacat(text, c1, c2, cd):
cr1 = catreg(c1)
cr2 = catreg(c2)
# cr1c=cr1+u"\n?"
# cr2c=cr2+u"\n?"
cr1e = catregesborra(c1)
cr2e = catregesborra(c2)
texcatd = u"[[Categoria:%s]]" % cd
texcatds = ur"[[Categoria:%s\1" % cd
if re.search(cr1, text):
text = re.sub(cr1, texcatds, text)
text = re.sub(cr2e, "", text)
else:
text = re.sub(cr1e, "",text)
if re.search(cr2,text):
text = re.sub(cr2,texcatds,text)
elif re.search(u"\[\[ *[Cc]ategoria *:", text):
text = re.sub(u"\[\[ *[Cc]ategoria *:", u"%s\n[[Categoria:" % texcatd, text, count=1)
else:
print u"No trobo on posar la categoria i la poso al final"
text += u"\n%s" % textcatd
return text
# Treu en una pàgina la categoria c1
# Els arguments són el text de la pàgina i el nom de la categoria
# (sense "Categoria:").
def treucat(text, c1):
cr1 = catreg(c1)
cr1c = u"%s\n?" % catregesborra(c1)
if re.search(cr1, text):
text = re.sub(cr1c, u"", text)
else:
print u"No trobo la categoria %s que he de treure" % c1
return text
# Recull dades d'una categoria en una tupla
def totcat(titol, filtre=u"", recurse=True):
print "Llegint la categoria", titol
categoria = catlib.Category(site, titol)
contingut0 = categoria.articlesList(recurse=False)
if recurse:
subcategories, contingut = miracatfiltre(categoria, filtre=filtre)
else:
contingut = contingut0
subcategories = categoria.subcategoriesList(recurse=False)
return (titol, categoria, contingut0, contingut, subcategories)
# Interseca categories (editant els articles)
# Si treu=False no treu la categoria segon
# Les dades són les tuples de les categories a intersecar
# i la categoria resultat.
def interseca(primer, segon, tercer, treu=True):
tit1, cat1, cont01, cont1, subc1 = primer
tit2, cat2, cont02, cont2, subc2 = segon
tit3, cat3, cont03, cont3, subc3 = tercer
scont1 = set(cont1)
scont2 = set(cont2)
scont3 = set(cont3)
sconti = (scont1 & scont2) - scont3
# print cat1,scont1
# print cat2,scont2
# print cat3,scont3
print u"Resultat:",sconti
for el in sconti:
print el
text = el.get(force=True)
if treu:
noutext = canviacat(text, tit1, tit2, tit3)
else:
noutext = canviacat(text, tit1, tit1, tit3)
# print noutext
if noutext != text:
sumari = u"Robot posa [[Categoria:{}]] intersecant [[Categoria:{}]] i [[Categoria:{}]]".format(tit3, tit1, tit2)
el.put(noutext, sumari)
else:
print u"No ha canviat res"
return
# Treu categories redundants.
# Les dades són les tuples de la categoria redundant i la categoria a conservar.
def neteja(redundant, conserva):
tit1, cat1, cont01, cont1, subc1 = redundant
tit2, cat2, cont02, cont2, subc2 = conserva
scont01 = set(cont01)
scont02 = set(cont02)
streure = scont01 & scont02
if len(streure) > 0:
print u"Començo a treure la categoria redundant %s" % tit1
else:
print u"No és redundant %s" % tit1
for el in streure:
print el
text = el.get(force=True)
noutext = treucat(text, tit1)
if noutext != text:
sumari = u"Robot treu [[Categoria:{}]] redundant amb [[Categoria:{}]]".format(tit1, tit2)
el.put(noutext, sumari)
else:
print u"No ha canviat res"
return
#El programa comença aquí
def principal():
#cienb=totcat(u"Científics barcelonins contemporanis")
#ciencc=totcat(u"Científics catalans del sud contemporanis",recurse=False)
#neteja(ciencc,cienb)
bcnc = totcat(u"Barcelonins contemporanis",recurse=True,filtre=u"històrics|Obres d|Quadres")
advc = totcat(u"Advocats catalans",filtre=u"Advocats barcelonins contemporanis")
advbc = totcat(u"Advocats barcelonins contemporanis")
interseca(bcnc,advc,advbc)
advb = totcat(u"Advocats barcelonins",filtre=u"Advocats barcelonins contemporanis")
interseca(bcnc, advb, advbc)
bcn=totcat(u"Barcelonins", recurse=True, filtrec=u"històrics|Obres d|Quadres|contemporanis|cinema|televisió")
#pv=totcat(u"Persones vives",recurse=False)
#interseca(bcn,pv,bcnc,treu=False)
#medalla=totcat(u"Medalles d'Honor de Barcelona",filtrec=u"Universitat de Barcelona")
#interseca(bcn,medalla,bcnc,treu=False)
premis=totcat(u"Premis de Catalunya", filtrec=u"Universitat de (Barcelona|València)|Montserat|Poblet|Mèxic")
interseca(bcn, premis, bcnc, treu=False)
#cienc=totcat(u"Científics catalans")
#interseca(bcnc,cienc,cienb)
neteja(bcn, bcnc)
#neteja(macb,mc2)
#neteja(macb2,mc2)
#neteja(macb3,mc3)
#neteja(macb4,mc4)
#neteja(macb5,mc5)
#neteja(macb6,mc6)
#neteja(macb7,mc7)
#interseca(macb,mc1,macb2)
#interseca(macb,mc1,mc2)
#mpirc=totcat(u"Muntanyes del Pirineu català",recurse=False)
#mpirf=totcat(u"Muntanyes del Pirineu francès",recurse=False)
#mfontp=totcat(u"Muntanyes de Fontpedrosa")
#mvall=totcat(u"Muntanyes del Vallespir")
#mconf=totcat(u"Muntanyes del Conflent")
#mpalls=totcat(u"Muntanyes del Pallars Sobirà")
#mac=totcat(u"Muntanyes de l'Alta Cerdanya")
#mpineda=totcat(u"Patrimoni monumental de Manresa")
#masies=totcat(u"Masies")
#mbaix=totcat(u"Masies del Baix Llobregat")
#mcorb=totcat(u"Masies de Corbera de Llobregat")
#corbera=totcat(u"Corbera de Llobregat")
#interseca(mbaix,corbera,mcorb)
#interseca(masies,corbera,mcorb)
#stjust=totcat(u"Sant Just Desvern")
#mstjust=totcat(u"masies de Sant Just Desvern")
#interseca(mbaix,stjust,mstjust)
#interseca(masies,stjust,mstjust)
#estjust=totcat(u"edificis de Sant Just Desvern")
#neteja(estjust,mstjust)
#espl=totcat(u"Esplugues de Llobregat")
#mespl=totcat(u"Masies d'Esplugues de Llobregat")
#interseca(mbaix,espl,mespl)
#interseca(masies,espl,mespl)
#mlbaix=totcat(u"Monuments d'interès local del Baix Llobregat")
#mlcat=totcat(u"Monuments d'interès local de Catalunya")
#pcorb=totcat(u"Patrimoni monumental de Corbera de Llobregat")
#mlcorb=totcat(u"Monuments d'interès local de Corbera de Llobregat")
#interseca(mlbaix,pcorb,mlcorb)
#interseca(mlcat,pcorb,mlcorb)
#interseca(mlcat,corb,mlcorb)
#pmaresme=totcat(u"patrimoni monumental del Maresme")
#dosrius=totcat(u"Dosrius")
#pdosrius=totcat(u"patrimoni monumental de Dosrius")
#pineda=totcat(u"Pineda de Mar")
#ppineda=totcat(u"patrimoni monumental de Pineda de Mar")
#tordera=totcat(u"Tordera")
#ptordera=totcat(u"patrimoni monumental de Tordera")
#malgrat=totcat(u"Malgrat de Mar")
#pmalgrat=totcat(u"patrimoni monumental de Malgrat de Mar")
#neteja(advocatsc,advocatsm)
#neteja(manresans,advocatsm)
if __name__ == '__main__':
site = wikipedia.getSite('ca')
principal()
wikipedia.stopme()