Script ad hoc

Inserire valori specifici in ciascuna voce

A volte capita di dover popolare con dei dati una serie di voci. Essendo questi parametri diversi da voce a voce, una classica sostituzione con replace.py è impossibile. Si usa allora uno script ad hoc che verifica il nome della voce in una collezione di dati e inserisce i valori corrispondenti. Il primo passo è trasformare mediante semplici sostituzioni di testo i dati forniti (di solito in CSV) in un array bidimensionale. Poi si crea un ciclo for che confronta il nome della voce con il corrispondente campo nell'array. Se viene trovata la corrispondenza si valorizzano le variabili e quindi si procede all'aggiornamento della voce.

Esempio dello script utilizzato per questa richiesta.

#!/usr/bin/python
# -*- coding: utf-8  -*-
"""
The following parameters are supported:

&params;

-dry              If given, doesn't do any real changes, but only shows
                  what would have been changed.

All other parameters will be regarded as part of the title of a single page,
and the bot will only work on that single page.
"""
__version__ = '$Id: basic.py 7845 2009-12-30 17:02:05Z xqt $'
import wikipedia as pywikibot
import wikipedia, time
import pagegenerators
import re
import string

# This is required for the text that is shown when you run this script
# with the parameter -help.
docuReplacements = {
    '&params;': pagegenerators.parameterHelp
}

def annotaproblema(pag, errore=""):
    try:
        log = open("log_navboxcomuni.txt", 'a')
    except:
        print "qualche problema ad annotare il problema"
        return -1
    messaggio = u"* "+pag+" "+errore+u"\r\n"
    log.write(messaggio.encode('utf-8'))
    log.close()
    print "problema annotato"

class BasicBot:
    msg = { # oggetto della modifica
        'it': u"Bot: inserimento [[Template:Navbox comuni italiani per provincia]] come da [[Discussioni progetto:Amministrazioni#Anomalie template]]",
        'en': u"Bot: test",
    }

    def __init__(self, generator, dry):
        """
        Constructor. Parameters:
            * generator - The page generator that determines on which pages
                          to work on.
            * dry       - If True, doesn't do any real changes, but only shows
                          what would have been changed.
        """
        self.generator = generator
        self.dry = dry
        # Set the edit summary /*message
        self.summary = pywikibot.translate(pywikibot.getSite(), self.msg)

    def run(self):
        for page in self.generator:
            self.treat(page)

    def treat(self, page):
        print ""
        confirmation = False
        try:
            text = page.get()
        except pywikibot.NoPage:
            pywikibot.output(u"Page %s does not exist; skipping." % page.aslink())
            return
        except pywikibot.IsRedirectPage:
            pywikibot.output(u"%s e' un redirect" % page.aslink())
##            text = page.get(get_redirect=True)
##            redirect = True

        dati = [
        [u"Template:Provincia di Agrigento", u"33439066", u"2010-07-09T20:28:05Z", u"", u"", u"Sicilia", u"", u"Agrigento", u"Provincia di Agrigento-Stemma.png", u"[[Agrigento]] · [[Alessandria della Rocca]] · [[Aragona (Italia)|Aragona]] · [[Bivona]] · [[Burgio]] · [[Calamonaci]] · [[Caltabellotta]] · [[Camastra]] · [[Cammarata]] · [[Campobello di Licata]] · [[Canicattì]] · [[Casteltermini]] · [[Castrofilippo]] · [[Cattolica Eraclea]] · [[Cianciana]] · [[Comitini]] · [[Favara]] · [[Grotte]] · [[Joppolo Giancaxio]] · [[Lampedusa e Linosa]] · [[Licata]] · [[Lucca Sicula]] · [[Menfi]] · [[Montallegro]] · [[Montevago]] · [[Naro]] · [[Palma di Montechiaro]] · [[Porto Empedocle]] · [[Racalmuto]] · [[Raffadali]] · [[Ravanusa]] · [[Realmonte]] · [[Ribera]] · [[Sambuca di Sicilia]] · [[San Biagio Platani]] · [[San Giovanni Gemini]] · [[Sant'Angelo Muxaro]] · [[Santa Elisabetta (Italia)|Santa Elisabetta]] · [[Santa Margherita di Belice]] · [[Santo Stefano Quisquina]] · [[Sciacca]] · [[Siculiana]] · [[Villafranca Sicula]]"],
        [u"Template:Provincia di Alessandria", u"33439090", u"2010-07-09T20:28:55Z", u"", u"", u"Piemonte", u"", u"Alessandria", u"Provincia di Alessandria-Stemma.png", u"[[Acqui Terme]] · [[Albera Ligure]] · [[Alessandria]] · [[Alfiano Natta]] · [[Alice Bel Colle]] · [[Alluvioni Cambiò]] · [[Altavilla Monferrato]] · [[Alzano Scrivia]] · [[Arquata Scrivia]] · [[Avolasca]] · [[Balzola]] · [[Basaluzzo]] · [[Bassignana]] · [[Belforte Monferrato]] · [[Bergamasco (Italia)|Bergamasco]] · [[Berzano di Tortona]] · [[Bistagno]] · [[Borghetto di Borbera]] · [[Borgo San Martino]] · [[Borgoratto Alessandrino]] · [[Bosco Marengo]] · [[Bosio]] · [[Bozzole]] · [[Brignano-Frascata]] · [[Cabella Ligure]] · [[Camagna Monferrato]] · [[Camino (Italia)|Camino]] · [[Cantalupo Ligure]] · [[Capriata d'Orba]] · [[Carbonara Scrivia]] · [[Carentino]] · [[Carezzano]] · [[Carpeneto]] · [[Carrega Ligure]] · [[Carrosio]] · [[Cartosio]] · [[Casal Cermelli]] · [[Casale Monferrato]] · [[Casaleggio Boiro]] · [[Casalnoceto]] · [[Casasco]] · [[Cassano Spinola]] · [[Cassine]] · [[Cassinelle]] · [[Castellania]] · [[Castellar Guidobono]] · [[Castellazzo Bormida]] · [[Castelletto Merli]] · [[Castelletto Monferrato]] · [[Castelletto d'Erro]] · [[Castelletto d'Orba]] · [[Castelnuovo Bormida]] · [[Castelnuovo Scrivia]] · [[Castelspina]] · [[Cavatore]] · [[Cella Monte]] · [[Cereseto]] · [[Cerreto Grue]] · [[Cerrina Monferrato]] · [[Coniolo]] · [[Conzano]] · [[Costa Vescovato]] · [[Cremolino]] · [[Cuccaro Monferrato]] · [[Denice]] · [[Dernice]] · [[Fabbrica Curone]] · [[Felizzano]] · [[Fraconalto]] · [[Francavilla Bisio]] · [[Frascaro]] · [[Frassinello Monferrato]] · [[Frassineto Po]] · [[Fresonara]] · [[Frugarolo]] · [[Fubine]] · [[Gabiano]] · [[Gamalero]] · [[Garbagna]] · [[Gavazzana]] · [[Gavi]] · [[Giarole]] · [[Gremiasco]] · [[Grognardo]] · [[Grondona]] · [[Guazzora]] · [[Isola Sant'Antonio]] · [[Lerma]] · [[Lu (Italia)|Lu]] · [[Malvicino]] · [[Masio]] · [[Melazzo]] · [[Merana]] · [[Mirabello Monferrato]] · [[Molare (Italia)|Molare]] · [[Molino dei Torti]] · [[Mombello Monferrato]] · [[Momperone]] · [[Moncestino]] · [[Mongiardino Ligure]] · [[Monleale]] · [[Montacuto]] · [[Montaldeo]] · [[Montaldo Bormida]] · [[Montecastello]] · [[Montechiaro d'Acqui]] · [[Montegioco]] · [[Montemarzino]] · [[Morano sul Po]] · [[Morbello]] · [[Mornese]] · [[Morsasco]] · [[Murisengo]] · [[Novi Ligure]] · [[Occimiano]] · [[Odalengo Grande]] · [[Odalengo Piccolo]] · [[Olivola]] · [[Orsara Bormida]] · [[Ottiglio]] · [[Ovada]] · [[Oviglio]] · [[Ozzano Monferrato]] · [[Paderna]] · [[Pareto]] · [[Parodi Ligure]] · [[Pasturana]] · [[Pecetto di Valenza]] · [[Pietra Marazzi]] · [[Piovera]] · [[Pomaro Monferrato]] · [[Pontecurone]] · [[Pontestura]] · [[Ponti (Italia)|Ponti]] · [[Ponzano Monferrato]] · [[Ponzone]] · [[Pozzol Groppo]] · [[Pozzolo Formigaro]] · [[Prasco]] · [[Predosa]] · [[Quargnento]] · [[Quattordio]] · [[Ricaldone]] · [[Rivalta Bormida]] · [[Rivarone]] · [[Rocca Grimalda]] · [[Roccaforte Ligure]] · [[Rocchetta Ligure]] · [[Rosignano Monferrato]] · [[Sala Monferrato]] · [[Sale (Italia)|Sale]] · [[San Cristoforo (Italia)|San Cristoforo]] · [[San Giorgio Monferrato]] · [[San Salvatore Monferrato]] · [[San Sebastiano Curone]] · [[Sant'Agata Fossili]] · [[Sardigliano]] · [[Sarezzano]] · [[Serralunga di Crea]] · [[Serravalle Scrivia]] · [[Sezzadio]] · [[Silvano d'Orba]] · [[Solero]] · [[Solonghello]] · [[Spigno Monferrato]] · [[Spineto Scrivia]] · [[Stazzano]] · [[Strevi]] · [[Tagliolo Monferrato]] · [[Tassarolo]] · [[Terruggia]] · [[Terzo (Italia)|Terzo]] · [[Ticineto]] · [[Tortona]] · [[Treville]] · [[Trisobbio]] · [[Valenza (Italia)|Valenza]] · [[Valmacca]] · [[Vignale Monferrato]] · [[Vignole Borbera]] · [[Viguzzolo]] · [[Villadeati]] · [[Villalvernia]] · [[Villamiroglio]] · [[Villanova Monferrato]] · [[Villaromagnano]] · [[Visone (Italia)|Visone]] · [[Volpedo]] · [[Volpeglino]] · [[Voltaggio (Italia)|Voltaggio]]"],
        [u"Template:Provincia di Ancona", u"33439093", u"2010-07-09T20:29:05Z", u"", u"", u"Marche", u"", u"Ancona", u"Provincia di Ancona-Stemma.png", u"[[Agugliano]] · [[Ancona]] · [[Arcevia]] · [[Barbara (Italia)|Barbara]] · [[Belvedere Ostrense]] · [[Camerano]] · [[Camerata Picena]] · [[Castel Colonna]] · [[Castelbellino]] · [[Castelfidardo]] · [[Castelleone di Suasa]] · [[Castelplanio]] · [[Cerreto d'Esi]] · [[Chiaravalle]] · [[Corinaldo]] · [[Cupramontana]] · [[Fabriano]] · [[Falconara Marittima]] · [[Filottrano]] · [[Genga]] · [[Jesi]] · [[Loreto]] · [[Maiolati Spontini]] · [[Mergo]] · [[Monsano]] · [[Monte Roberto]] · [[Monte San Vito]] · [[Montecarotto]] · [[Montemarciano]] · [[Monterado]] · [[Morro d'Alba]] · [[Numana]] · [[Offagna]] · [[Osimo]] · [[Ostra (Italia)|Ostra]] · [[Ostra Vetere]] · [[Poggio San Marcello]] · [[Polverigi]] · [[Ripe (Italia)|Ripe]] · [[Rosora]] · [[San Marcello (Italia)|San Marcello]] · [[San Paolo di Jesi]] · [[Santa Maria Nuova]] · [[Sassoferrato]] · [[Senigallia]] · [[Serra de' Conti]] · [[Serra San Quirico]] · [[Sirolo]] · [[Staffolo]]"],
        [u"Template:Regione autonoma Valle d'Aosta", u"33593702", u"2010-07-16T12:37:01Z", u"Regione autonoma Valle d'Aosta", u"Comuni della [[Valle d'Aosta]]", u"", u"", u"", u"Valle d'Aosta-Stemma_it.svg", u"[[Allein]] · [[Antey-Saint-André]] · [[Aosta]] · [[Arnad]] · [[Arvier]] · [[Avise]] · [[Ayas]] · [[Aymavilles]] · [[Bard (Italia)|Bard]] · [[Bionaz]] · [[Brissogne]] · [[Brusson (Italia)|Brusson]] · [[Challand-Saint-Anselme]] · [[Challand-Saint-Victor]] · [[Chambave]] · [[Chamois]] · [[Champdepraz]] · [[Champorcher]] · [[Charvensod]] · [[Châtillon (Italia)|Châtillon]] · [[Cogne]] · [[Courmayeur]] · [[Donnas]] · [[Doues]] · [[Emarèse]] · [[Étroubles]] · [[Fénis]] · [[Fontainemore]] · [[Gaby]] · [[Gignod]] · [[Gressan]] · [[Gressoney-La-Trinité]] · [[Gressoney-Saint-Jean]] · [[Hône]] · [[Introd]] · [[Issime]] · [[Issogne]] · [[Jovençan]] · [[La Magdeleine (Italia)|La Magdeleine]] · [[La Salle (Italia)|La Salle]] · [[La Thuile (Italia)|La Thuile]] · [[Lillianes]] · [[Montjovet]] · [[Morgex]] · [[Nus]] · [[Ollomont]] · [[Oyace]] · [[Perloz]] · [[Pollein]] · [[Pont-Saint-Martin (Italia)|Pont-Saint-Martin]] · [[Pontboset]] · [[Pontey]] · [[Pré-Saint-Didier]] · [[Quart (Italia)|Quart]] · [[Rhêmes-Notre-Dame]] · [[Rhêmes-Saint-Georges]] · [[Roisan]] · [[Saint-Christophe (Italia)|Saint-Christophe]] · [[Saint-Denis (Italia)|Saint-Denis]] · [[Saint-Marcel (Italia)|Saint-Marcel]] · [[Saint-Nicolas (Italia)|Saint-Nicolas]] · [[Saint-Oyen (Italia)|Saint-Oyen]] · [[Saint-Pierre (Italia)|Saint-Pierre]] · [[Saint-Rhémy-en-Bosses]] · [[Saint-Vincent (Italia)|Saint-Vincent]] · [[Sarre]] · [[Torgnon]] · [[Valgrisenche]] · [[Valpelline]] · [[Valsavarenche]] · [[Valtournenche]] · [[Verrayes]] · [[Verrès]] · [[Villeneuve (Italia)|Villeneuve]]"],
        [u"Template:Provincia dell'Aquila", u"33439043", u"2010-07-09T20:27:25Z", u"", u"", u"Abruzzo", u"dell'", u"Aquila", u"Provincia dell'Aquila-Stemma.png", u"[[Acciano]] · [[Aielli]] · [[Alfedena]] · [[Anversa degli Abruzzi]] · [[Ateleta]] · [[Avezzano]] · [[Balsorano]] · [[Barete]] · [[Barisciano]] · [[Barrea]] · [[Bisegna]] · [[Bugnara]] · [[Cagnano Amiterno]] · [[Calascio]] · [[Campo di Giove]] · [[Campotosto]] · [[Canistro]] · [[Cansano]] · [[Capestrano]] · [[Capistrello]] · [[Capitignano]] · [[Caporciano]] · [[Cappadocia (Italia)|Cappadocia]] · [[Carapelle Calvisio]] · [[Carsoli]] · [[Castel del Monte (comune)|Castel del Monte]] · [[Castel di Ieri]] · [[Castel di Sangro]] · [[Castellafiume]] · [[Castelvecchio Calvisio]] · [[Castelvecchio Subequo]] · [[Celano]] · [[Cerchio (Italia)|Cerchio]] · [[Civita d'Antino]] · [[Civitella Alfedena]] · [[Civitella Roveto]] · [[Cocullo]] · [[Collarmele]] · [[Collelongo]] · [[Collepietro]] · [[Corfinio]] · [[Fagnano Alto]] · [[Fontecchio]] · [[Fossa (Italia)|Fossa]] · [[Gagliano Aterno]] · [[Gioia dei Marsi]] · [[Goriano Sicoli]] · [[Introdacqua]] · [[L'Aquila]] · [[Lecce nei Marsi]] · [[Luco dei Marsi]] · [[Lucoli]] · [[Magliano de' Marsi]] · [[Massa d'Albe]] · [[Molina Aterno]] · [[Montereale]] · [[Morino]] · [[Navelli]] · [[Ocre]] · [[Ofena]] · [[Opi (Italia)|Opi]] · [[Oricola]] · [[Ortona dei Marsi]] · [[Ortucchio]] · [[Ovindoli]] · [[Pacentro]] · [[Pereto]] · [[Pescasseroli]] · [[Pescina]] · [[Pescocostanzo]] · [[Pettorano sul Gizio]] · [[Pizzoli]] · [[Poggio Picenze]] · [[Prata d'Ansidonia]] · [[Pratola Peligna]] · [[Prezza]] · [[Raiano]] · [[Rivisondoli]] · [[Rocca Pia]] · [[Rocca di Botte]] · [[Rocca di Cambio]] · [[Rocca di Mezzo]] · [[Roccacasale]] · [[Roccaraso]] · [[San Benedetto dei Marsi]] · [[San Benedetto in Perillis]] · [[San Demetrio ne' Vestini]] · [[San Pio delle Camere]] · [[San Vincenzo Valle Roveto]] · [[Sant'Eusanio Forconese]] · [[Sante Marie]] · [[Santo Stefano di Sessanio]] · [[Scanno]] · [[Scontrone]] · [[Scoppito]] · [[Scurcola Marsicana]] · [[Secinaro]] · [[Sulmona]] · [[Tagliacozzo]] · [[Tione degli Abruzzi]] · [[Tornimparte]] · [[Trasacco]] · [[Villa Sant'Angelo]] · [[Villa Santa Lucia degli Abruzzi]] · [[Villalago]] · [[Villavallelonga]] · [[Villetta Barrea]] · [[Vittorito]]"],
        # [...]
        [u"Template:Provincia di Vicenza", u"33448491", u"2010-07-10T08:35:44Z", u"", u"", u"Veneto", u"", u"Vicenza", u"Provincia di Vicenza-Stemma.png", u"[[Agugliaro]] · [[Albettone]] · [[Alonte]] · [[Altavilla Vicentina]] · [[Altissimo]] · [[Arcugnano]] · [[Arsiero]] · [[Arzignano]] · [[Asiago]] · [[Asigliano Veneto]] · [[Barbarano Vicentino]] · [[Bassano del Grappa]] · [[Bolzano Vicentino]] · [[Breganze]] · [[Brendola]] · [[Bressanvido]] · [[Brogliano]] · [[Caldogno]] · [[Caltrano]] · [[Calvene]] · [[Camisano Vicentino]] · [[Campiglia dei Berici]] · [[Campolongo sul Brenta]] · [[Carrè]] · [[Cartigliano]] · [[Cassola]] · [[Castegnero]] · [[Castelgomberto]] · [[Chiampo]] · [[Chiuppano]] · [[Cismon del Grappa]] · [[Cogollo del Cengio]] · [[Conco]] · [[Cornedo Vicentino]] · [[Costabissara]] · [[Creazzo]] · [[Crespadoro]] · [[Dueville]] · [[Enego]] · [[Fara Vicentino]] · [[Foza]] · [[Gallio (Italia)|Gallio]] · [[Gambellara]] · [[Gambugliano]] · [[Grancona]] · [[Grisignano di Zocco]] · [[Grumolo delle Abbadesse]] · [[Isola Vicentina]] · [[Laghi (Italia)|Laghi]] · [[Lastebasse]] · [[Longare]] · [[Lonigo]] · [[Lugo di Vicenza]] · [[Lusiana]] · [[Malo]] · [[Marano Vicentino]] · [[Marostica]] · [[Mason Vicentino]] · [[Molvena]] · [[Monte di Malo]] · [[Montebello Vicentino]] · [[Montecchio Maggiore]] · [[Montecchio Precalcino]] · [[Montegalda]] · [[Montegaldella]] · [[Monteviale]] · [[Monticello Conte Otto]] · [[Montorso Vicentino]] · [[Mossano]] · [[Mussolente]] · [[Nanto]] · [[Nogarole Vicentino]] · [[Nove (Italia)|Nove]] · [[Noventa Vicentina]] · [[Orgiano]] · [[Pedemonte]] · [[Pianezze]] · [[Piovene Rocchette]] · [[Pojana Maggiore]] · [[Posina]] · [[Pove del Grappa]] · [[Pozzoleone]] · [[Quinto Vicentino]] · [[Recoaro Terme]] · [[Roana]] · [[Romano d'Ezzelino]] · [[Rosà]] · [[Rossano Veneto]] · [[Rotzo]] · [[Salcedo (Italia)|Salcedo]] · [[San Germano dei Berici]] · [[San Nazario (Italia)|San Nazario]] · [[San Pietro Mussolino]] · [[San Vito di Leguzzano]] · [[Sandrigo]] · [[Santorso]] · [[Sarcedo]] · [[Sarego]] · [[Schiavon]] · [[Schio]] · [[Solagna]] · [[Sossano]] · [[Sovizzo]] · [[Tezze sul Brenta]] · [[Thiene]] · [[Tonezza del Cimone]] · [[Torrebelvicino]] · [[Torri di Quartesolo]] · [[Trissino]] · [[Valdagno]] · [[Valdastico]] · [[Valli del Pasubio]] · [[Valstagna]] · [[Velo d'Astico]] · [[Vicenza]] · [[Villaga]] · [[Villaverla]] · [[Zanè]] · [[Zermeghedo]] · [[Zovencedo]] · [[Zugliano]]"],
        [u"Template:Provincia di Viterbo", u"33448500", u"2010-07-10T08:35:54Z", u"", u"", u"Lazio", u"", u"Viterbo", u"Provincia di Viterbo-Stemma.png", u"[[Acquapendente]] · [[Arlena di Castro]] · [[Bagnoregio]] · [[Barbarano Romano]] · [[Bassano Romano]] · [[Bassano in Teverina]] · [[Blera]] · [[Bolsena]] · [[Bomarzo]] · [[Calcata]] · [[Canepina]] · [[Canino]] · [[Capodimonte]] · [[Capranica]] · [[Caprarola]] · [[Carbognano]] · [[Castel Sant'Elia]] · [[Castiglione in Teverina]] · [[Celleno]] · [[Cellere]] · [[Civita Castellana]] · [[Civitella d'Agliano]] · [[Corchiano]] · [[Fabrica di Roma]] · [[Faleria]] · [[Farnese]] · [[Gallese (Italia)|Gallese]] · [[Gradoli]] · [[Graffignano]] · [[Grotte di Castro]] · [[Ischia di Castro]] · [[Latera]] · [[Lubriano]] · [[Marta (Italia)|Marta]] · [[Montalto di Castro]] · [[Monte Romano]] · [[Montefiascone]] · [[Monterosi]] · [[Nepi]] · [[Onano]] · [[Oriolo Romano]] · [[Orte]] · [[Piansano]] · [[Proceno]] · [[Ronciglione]] · [[San Lorenzo Nuovo]] · [[Soriano nel Cimino]] · [[Sutri]] · [[Tarquinia]] · [[Tessennano]] · [[Tuscania]] · [[Valentano]] · [[Vallerano]] · [[Vasanello]] · [[Vejano]] · [[Vetralla]] · [[Vignanello]] · [[Villa San Giovanni in Tuscia]] · [[Viterbo]] · [[Vitorchiano]]"],
        [u"Template:Provincia di Massa e Carrara", u"33448060", u"2010-07-10T08:22:23Z", u"", u"", u"Toscana", u"", u"Massa e Carrara", u"Provincia di Massa-Carrara-Stemma.png", u"[[Aulla]] · [[Bagnone]] · [[Carrara]] · [[Casola in Lunigiana]] · [[Comano (Italia)|Comano]] · [[Filattiera]] · [[Fivizzano]] · [[Fosdinovo]] · [[Licciana Nardi]] · [[Massa (Italia)|Massa]] · [[Montignoso]] · [[Mulazzo]] · [[Podenzana]] · [[Pontremoli]] · [[Tresana]] · [[Villafranca in Lunigiana]] · [[Zeri]]"]]
        # "template", "revisionId", "revisionTimestamp", "pagina", "titolo", "regione", "preposizioneProvincia", "provincia", "stemma", "lista"

        trovata_corrispondenza = False    
        for i in (range (len(dati))):
            if page.title() == dati[i][0]:
                pywikibot.output(page.title())
                revision = int(dati[i][1])
                pagina = dati[i][3]
                titolo = dati[i][4]
                regione = dati[i][5]
                preposizioneProvincia = dati[i][6]
                provincia = dati[i][7]
                stemma = dati[i][8]
                lista = dati[i][9]
                trovata_corrispondenza = True

        if not trovata_corrispondenza:
            return

        m = re.search('<noinclude>[\W\w]+?</noinclude>', text)
        if m:
            noinclude = m.group(0)
        else:
            pywikibot.output("Non trovato noinclude!")
            annotaproblema(page.aslink(), "noinclude")
            return

        if page.latestRevision() != revision:
            pywikibot.output("RevisionId non corrispondente, la voce è stata modificata!")
            pywikibot.output("%d vs. %d" % (page.latestRevision(), revision))
            annotaproblema(page.aslink(), "revision")
            return

        nuovocodice = "{{Navbox comuni italiani per provincia"
        if pagina != "":
            nuovocodice += "\n|pagina = {{subst:PAGENAME}}"
            if titolo != "":
                nuovocodice += "\n|titolo = " + titolo
        nuovocodice += "\n|regione = " + regione
        if preposizioneProvincia != "":
            nuovocodice += "\n|preposizioneProvincia = " + preposizioneProvincia
        nuovocodice += "\n|provincia = " + provincia
        nuovocodice += "\n|stemma = " + stemma
        nuovocodice += "\n|lista = " + lista
        nuovocodice += "\n}}" + noinclude
        text = nuovocodice
        if text != page.get():
            pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
            pywikibot.showDiff(page.get(), text)
            if not self.dry:
                if not confirmation:
                    choice = 's'   ## AUTO!!
                else:
                    choice = pywikibot.inputChoice(u'Applicare i cambiamenti?', ['Si', 'No'], ['s', 'N'], 'N')
                if choice == 's':
                    try:
                        esito = page.put(text, comment=self.summary)
                        if esito[2]['result'] == 'Success':
                            print "OK"
                        else:
                            print esito
                            annotaproblema(page.aslink(), "failure")
                    except pywikibot.LockedPage:
                        pywikibot.output(u"Page %s is locked; skipping." % page.aslink())
                    except pywikibot.EditConflict:
                        pywikibot.output(u'Skipping %s because of edit conflict' % (page.title()))
                    except pywikibot.SpamfilterError, error:
                        pywikibot.output(u'Cannot change %s because of spam blacklist entry %s' % (page.title(), error.url))
                    except:
                        print "spam?"
                        annotaproblema(page.aslink(), "failure (spam?)")

def main():
    # This factory is responsible for processing command line arguments
    # that are also used by other scripts and that determine on which pages
    # to work on.
    genFactory = pagegenerators.GeneratorFactory()
    # The generator gives the pages that should be worked upon.
    gen = None
    # This temporary array is used to read the page title if one single
    # page to work on is specified by the arguments.
    pageTitleParts = []
    # If dry is True, doesn't do any real changes, but only show
    # what would have been changed.
    dry = False

    # Parse command line arguments
    for arg in pywikibot.handleArgs():
        if arg.startswith("-dry"):
            dry = True
        else:
            # check if a standard argument like
            # -start:XYZ or -ref:Asdf was given.
            if not genFactory.handleArg(arg):
                pageTitleParts.append(arg)

    if pageTitleParts != []:
        # We will only work on a single page.
        pageTitle = ' '.join(pageTitleParts)
        page = pywikibot.Page(pywikibot.getSite(), pageTitle)
        gen = iter([page])

    if not gen:
        gen = genFactory.getCombinedGenerator()
    if gen:
        # The preloading generator is responsible for downloading multiple
        # pages from the wiki simultaneously.
        gen = pagegenerators.PreloadingGenerator(gen)
        bot = BasicBot(gen, dry)
        bot.run()
    else:
        pywikibot.showHelp()
##
annotare_pag = False
annotare_sez = False
if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme()

Raccolte di regex da inserire in userfixes.py

  Lo stesso argomento in dettaglio: Utente:FrescoBot/FAQ § User-fixes.py.

Categorizzare

       'categorizzare': {
       'regex': True,
       'recursive': False,
       'msg': {
              'it':u"Bot: solo categorie nascoste -> categorizzare",
             },
       'replacements': [

(u'({{ *[EePpCcTt] *\|[^=\|\[}]+\|)([^=\|\[}]+)([\|}]([\W\w]+)$)', ur'\1\2\3\n{{categorizzare|\2}}'),
(u'({{ *[EePpCcTt] *\|[^\|\[}]+\| *argomento *= *)([^=\|\[}]+)([\|}]([\W\w]+)$)', ur'\1\2\3\n{{categorizzare|\2}}'),
(u'({{ *[OoFfSs] *\|)([^=\|\[}]+)([\|}]([\W\w]+)$)', ur'\1\2\3\n{{categorizzare|\2}}'),
(u'({{categorizzare\|([\W\w](?!{{categorizzare))+?[\W\w]){{categorizzare\|[^}]+}}\s*', ur'\1'),
(u'^([\W\w]+)$', ur'\1\n{{categorizzare}}'),
(u'({{categorizzare[^}]*}})\s*{{categorizzare[^}]*}}', ur'\1'),

      ],
        'exceptions': {
                    'inside-tags': [
##                                'hyperlink',    
##                                'link',
##                                'comment',
##                                'template',
##                                'timeline',
##                                'gallery',
##                                'math',
##                                'pre',
##                                'startspace',
##                                'source', 
##                                'nowiki'
                        ],
                    'text-contains': [
                                ur'{{([Bb]io\s|[Ss]portivo|[Aa]lbum|[Aa]rtista musicale)',
                                ur'{{ *[AWaw] *[\|}]',
                                ur'{{ *[cC]ategorizzare',
                                ur'\[\[[Cc]ategoria:(?![Ss]tub|[Aa]iutare|[Cc]ontrollare|[Cc]orreggere|[Vv]oci |[Dd]a )',
                                ur'{{[tT]rasferimento',
                                ur'#([Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]|[Rr][Ii][Nn][Vv][Ii][Aa])',
                                ]                    
        }
   },