Projet:Bot/Codes/PY
Un article de Wikipédia, l'encyclopédie libre.
Pour ajouter un nouveau code, utilisez {{subst:Projet:Bot/Codes/E|auteur=|titre=|date=|langage=}}, puis complétez les informations manquantes.
Sommaire |
[modifier] MyBot (d · c · b)
Codes également sous licence GPL. Inspiré au départ par le SimpletBot de Dake.
auteur : IAlex (d · c · b) | Création : entre novembre 2006 et avril 2008 (dépend des scripts) | Dernière modification : 8 avril 2008 |
[modifier] Méthodes générales
[modifier] Descriptif
Deux méthodes qui seront utiles aux autres morceaux du programme.
[modifier] Code
import wikipedia import simplejson def SauvPage(Text, Page, Comment, ReplaceBotSection = False): if type(Page) in [type( '' ), type( u'' )]: ClsPage = wikipedia.Page(wikipedia.getSite(), Page) else: ClsPage = Page OldText = ClsPage.get() if ReplaceBotSection: try: i1 = re.search(u'<!-- BOT SECTION START -->',OldText).end() i2 = re.search(u'<!-- BOT SECTION STOP -->',OldText).start() Text = OldText[:i1] + Text + OldText[i2:] except: wikipedia.output( u'Une des balises n\'a pas pu être trouvée !' ) if OldText.strip() != Text.strip(): try: ClsPage.put(Text, Comment) except wikipedia.EditConflict: wikipedia.output(u"Conflit d'edition") else: wikipedia.output(u'Pas de changement nécessaire') del ClsPage def nomTri( text ): text = text.replace(u'é',u'e').replace(u'è',u'e').replace(u'ë',u'e').replace(u'ê',u'e') text = text.replace(u'á',u'a').replace(u'à',u'a').replace(u'ä',u'a').replace(u'â',u'a') text = text.replace(u'í',u'i').replace(u'ì',u'i').replace(u'ï',u'i').replace(u'î',u'a') text = text.replace(u'ó',u'o').replace(u'ò',u'o').replace(u'ö',u'o').replace(u'ô',u'o') text = text.replace(u'ú',u'u').replace(u'ù',u'u').replace(u'ü',u'u').replace(u'û',u'u') text = text.replace(u'É',u'E').replace(u'È',u'E').replace(u'Ë',u'E').replace(u'Ê',u'E') text = text.replace(u'À',u'A').replace(u'Ä',u'A').replace(u'Â',u'A') text = text.replace(u'Ì',u'I').replace(u'Ï',u'I').replace(u'Î',u'I') text = text.replace(u'Ò',u'O').replace(u'Ö',u'O').replace(u'Ô',u'O') text = text.replace(u'Ù',u'U').replace(u'Ü',u'U').replace(u'Û',u'U') return text def getDay(): Time = time.localtime(time.time()) Months = [u'', u'janvier', u'février', u'mars', u'avril', u'mai', u'juin', u'juillet', u'août', u'septembre', u'octobre', u'novembre', u'décembre'] Day = str(Time[2]).encode('utf-8') return Day + u' ' + Months[Time[1]] # Méthode pour rechercher les pages qui incluent (pas de simples liens) la page passée en paramètre # Le paramètre n'est pas un objet mais une chaine # Piqué de maintenance/update_namespaces.py et un peu modifié def getLinks(template): site = wikipedia.getSite() eicont = False if not site.apipath(): gen = wikipedia.Page(site, template).getReferences(False, True, True) for page in gen: yield page return while True: predata = {'action': 'query', 'query': 'list', 'list': 'embeddedin', 'einamespace': '0', 'eititle': template, 'eilimit': '5000', 'format': 'json'} if eicont != False: predata['eicontinue'] = eicont #print u'Getting references to [[' + template + u']]' try: response, json = site.postForm(site.apipath(), predata) except wikipedia.ServerError, e: output(u'Warning! %s: %s' % (site, e)) return try: data = simplejson.loads(json) except ValueError: wikipedia.output(u'Warning! %s is defined but does not exist!' % site) return for page in data['query']['embeddedin']: yield wikipedia.Page(site,data['query']['embeddedin'][page]['title']) try: eicont = data['query-continue']['embeddedin']['eicontinue'] except: break
[modifier] Discussion
[modifier] Mise à jour d'articles liés
[modifier] Descriptif
Routine qui permet de mettre à jour la liste d'articles liés.
Nécessite les fonctions 'SauvPage' et 'getLinks' qui se trouve dans #Méthodes générales.
Paramètres pour la routine 'Liste':
- PageLis: page contenant la liste des articles.
- PageNb: page où doit être inscrit le nombre d'articles liés (exemple: Modèle:Nombre articles entreprises).
- PageModif: page où mettre les nouveaux article ou une chaine vide pour ne pas utiliser cette fonction
- Bandeau: un tableau de pages de bandeaux (3 au maximum) sans 'Modèle:' devant.
[modifier] Code
import wikipedia import re def Liste(PageLis, PageNb, PageModif, Bandeaux): try: ExistingPages = set() NewPages = set() ClsPageLis = wikipedia.Page(wikipedia.getSite(), PageLis) if PageModif != u'': ClsPageModif = wikipedia.Page(wikipedia.getSite(), PageModif) PageModifText = ClsPageModif.get() PageExpr = re.compile(r"\{\{Article simple\|([^\n\|]*)}}") for match in PageExpr.findall(ClsPageLis.get()): ExistingPages.add( match ) ExistingPages = list(ExistingPages) if Bandeaux[1] == u'': liste = u"au bandeau {{M|" + Bandeaux[0] + u"}}" elif Bandeaux[2] == u'': liste = u"aux bandeaux {{M|" + Bandeaux[0] + u"}} et {{M|" + Bandeaux[1] + u"}}" else: liste = u"aux bandeaux {{M|" + Bandeaux[0] + u"}}, {{M|" + Bandeaux[1] + u"}} et {{M|" + Bandeaux[2] + u"}}" Text = u"\n<small>Liste mise à jour régulièrement par {{u|" + UserName + u"}} à partir des articles liés " + liste + u"</small>\n" Text += u"\n" Text += u"[[Special:Recentchangeslinked/" + PageLis + u"|Modifications récentes des articles ayant le bandeau de ce portail]]\n" Text += u"\n" Text += u"Liste des articles : \n" Count = 0 pages = set() for Bandeau in Bandeaux: if Bandeau != '': for page in getLinks( wikipedia.getSite().template_namespace() + ':' + Bandeau ): if page.namespace() == 0: Count += 1 pages.add( page.title() ) if not page.title() in ExistingPages: NewPages.add( page.title() ) pages = list( pages ) pagesTri = set() pagesRes = {} for page in pages: text = nomTri( page ) pagesTri.add( text ) pagesRes[ text ] = page pagesTri = list( pagesTri ) pagesTri.sort() for page in pagesTri: Text += u"{{Article simple|" + pagesRes[page] + u"}}\n" if PageLis != u'': SauvPage(Text, ClsPageLis, u'Bot : Mise à jour de la liste', True) if PageNb != u'': SauvPage(str(Count).encode('utf-8'), PageNb, u'Bot : Mise à jour du nombre d\'articles liés' + u' (' + str(Count).encode('utf-8') + u')', True) if PageModif != u'': try: StartPos = re.search(u'<!-- BOT SECTION -->',PageModifText).end() NewPages = list( NewPages ) Header = u"\n===== " + getDay() + u' =====' if not Header in PageModifText: AddText = Header else: AddText = u'' for NewPage in NewPages: AddText += u"\n{{Article simple|" + NewPage + u"}}" PageModifText = PageModifText[:StartPos] + AddText + PageModifText[StartPos:] SauvPage( PageModifText, ClsPageModif, resListe ) except: wikipedia.output( u'La page ' + PageModif + u' n\'a pas pu être modifiée, balise manquante ?' ) except: wikipedia.output(u'Error in Liste()')
[modifier] Discussion
à quoi sert l'ajout que tu viens de faire ? -- Chico (blabla) 13 septembre 2007 à 20:11 (CEST)
- A trier les pages sans prendre en compte les accents. iAlex (Ici ou là), le 18 novembre 2007 à 12:10 (CET)
- Ou il y a une petite erreur ou je n'ai rien compris :
- ...
- text = text.replace(u'ú',u'u').replace(u'ù',u'u').replace(u'ü',u'u').replace(u'û',u'u')
- text =
pagetext.replace(u'É',u'E').replace(u'È',u'E').replace(u'Ë',u'E').replace(u'Ê',u'E') - text = text.replace(u'À',u'A').replace(u'Ä',u'A').replace(u'Â',u'A')
- ...
- ILJR (d) 7 avril 2008 à 12:39 (CEST)
- Ce code marche toujours maintenant que tous les bandeaux sont réunis au sein du modèle {{Portail}} ? Alecs.y (disc. - contr.) 7 avril 2008 à 13:48 (CEST)
- Je ne comprends pas du tout ta réponse.
- On peut se tutoyer ?
- ILJR (d) 7 avril 2008 à 14:32 (CEST)
- Ce n'était pas une réponse à ta question, mais plutôt une autre interrogation. Alecs.y (disc. - contr.) 7 avril 2008 à 17:34 (CEST)
- @ILJR: oui, je l'ai remarqué il y a pas longtemps, mais j'ai toujours pas mis à jour ces scripts (d'autant que je les ai pas mal modifiés).
- @Alecs.y: chaque bandeau a encore une page à lui qui stocke les styles (comme pour le bandeau {{Ébauche}}) et qui sont les mêmes pages qu'avant, donc ça ne devrait pas poser de problème majeur.
- iAlex (Ici ou là), le 7 avril 2008 à 17:51 (CEST)
- Il marche pas chez moi, je dois mal l'utiliser Alecs.y (disc. - contr.) 8 avril 2008 à 11:45 (CEST)
- J'ai mis les codes à jour, la sortie de l'api de MediaWiki a changé il y a presque deux mois et j'ai du modifier le script en conséquence, donc essaye de les mettre à jour, mais l'appel de la fonction Liste() a changé (le plus notable apparraissant en rouge dans la doc au dessus). Sinon ce serait plus utile si tu indiquais ce qui ne marche pas (et comment tu appelles la fonction, paramètres passés, ...) iAlex (Ici ou là), le 8 avril 2008 à 17:28 (CEST)
- Il marche pas chez moi, je dois mal l'utiliser Alecs.y (disc. - contr.) 8 avril 2008 à 11:45 (CEST)
- Ce n'était pas une réponse à ta question, mais plutôt une autre interrogation. Alecs.y (disc. - contr.) 7 avril 2008 à 17:34 (CEST)
[modifier] Mise à jour de Wikipédia:Liste des effectifs d'articles par portail
[modifier] Descriptif
Permet de mettre à jour la page Wikipédia:Liste des effectifs d'articles par portail.
Nécessite les fonctions 'SauvPage' et 'getLinks' qui se trouve dans #Méthodes générales.
Pour la configuration, voir Wikipédia:Liste des effectifs d'articles par portail/liste.
[modifier] Code
import wikipedia import re resPortails = u"Mise à jour de la liste" pagePortails = u"Wikipédia:Liste des effectifs d'articles par portail" pageListPortails = u"Wikipédia:Liste des effectifs d'articles par portail/liste" def MajPortails(): portails = {} pages = {} tot = 0 j = -1 for portail in wikipedia.Page(wikipedia.getSite(), u"Wikipédia:Liste des effectifs d'articles par portail/liste").get().split(u'\n'): j += 1 arr = {} if portail.startswith(u"<pre>") or portail.startswith(u"</pre>") or portail.startswith(u"##") or u"" == portail: arr[u"Type"] = "" elif portail.startswith(u"="): arr[u"Type"] = "Titre" arr[u"Titre"] = portail[1:] else: arr[u"Type"] = "Portail" n = 0 for setting in portail.split(u"|"): var = setting.split(u"=") if len( var ) == 2: arr[var[0]] = var[1] for bandeau in arr[u"bandeau"].split(u"<>"): wikipedia.output(bandeau) time.sleep(2) for page in getLinks(wikipedia.getSite().template_namespace() + ':' + bandeau): if page.namespace() == 0: n += 1 tot += n arr[u"count"] = n portails[j] = arr text = u"Dernière mise à jour le ~~~~~.\n\n" text += u"{| class='wikitable sortable'\n" text += u"|-\n" text += u"! Nom !! Compte !! Liste !! Tri premier niveau !! Tri deuxième niveau<!-- !! Tri troisième niveau !! Tri quatrième niveau -->\n" for k in range(0, j + 1): portail = portails[k] if portail[u"Type"] == "": continue elif portail[u"Type"] == "Titre": text += u"|-\n" text += u"| colspan='7' | <span style='display:none;'>" + nomTri( portail[u"Titre"] ) + u"</span><h3>" + portail[u"Titre"] + u"</h3>\n" elif portail[u"Type"] == "Portail": lis = u'' tri = u'' cont = 0 for bandeau in portail[u"bandeau"].split(u"<>"): if lis != u'': lis += u', ' tri += u', ' lis += "{{M|" + bandeau + u"}}" sort = bandeau if sort.startswith( u'Portail ' ): sort = sort[8:] tri += nomTri( sort ) n = str(portail[u"count"]) cle = u"<span style='display:none'>" + n.rjust( 6, '0' ).encode('utf-8') + u"</span>" text += u"|-\n" text += u"| <span style='display:none;'>" + tri + u"</span>" + lis + u" || " + cle[:28] + u"." + cle[28:] + u"{{formatnum:" + n.encode('utf-8') + u"}} || " if portail[u"page"] != u"": text += u"[[" + portail[u"page"] + u"]]" # text += u" || " # if portail.has_key( u"s1" ): # text += portail[u"s1"] # text += u" || " # if portail.has_key( u"s2" ): # text += portail[u"s2"] text += u" || " if portail.has_key( u"s3" ): text += portail[u"s3"] text += u" || " if portail.has_key( u"s4" ): text += portail[u"s4"] text += u"\n" text += u"|}\n" text += u"\n=== Total ===\n" text += u"Il y a au total {{formatnum:" + str(tot).encode('utf-8') + u"}} références à un bandeau. Attention, certains articles peuvent avoir plus d'un bandeau !\n" text += u"\n" try: wikipedia.output(u"############################") SauvPage(text, u"Wikipédia:Liste des effectifs d'articles par portail", u"Mise à jour de la liste", True) wikipedia.output(u"Terminé") except: wikipedia.output(u"Erreur dans la sauveagarde") wikipedia.output(u"#############################") wikipedia.output(text)
[modifier] Discussion
[modifier] Et pour faire tourner le tout...
[modifier] Descriptif
Permet de faire tourner chaque heure les scripts qui se trouvent aussi. Il y a certaine un bien meilleure manière de faire ça. Mettre ceci au bas du fichier.
Par défaut le script affiche une nouvelle ligne à chaque minute, il est possible de masquer ça.
Nécessite les scripts qui se trouvent au-dessus.
[modifier] Code
#pas besoin de reprendre les autres 'import' import re import time import wikipedia import simplejson RecentListePageLis = {} RecentListePageNb = {} RecentListeBandeau = {} RecentListeNb = 0 def PrintTime(Time): Days = [u'lundi', u'mardi', u'mercredi', u'jeudi', u'vendredi', u'samedi', u'dimanche'] DayName = Days[Time[6]] Day = str(Time[2]).encode('utf-8') Month = str(Time[1]).encode('utf-8') Year = str(Time[0]).encode('utf-8') Hour = str(Time[3]).encode('utf-8') Minute = str(Time[4]).encode('utf-8') Second = str(Time[5]).encode('utf-8') if Time[4] < 10: Minute = u'0' + Minute if Time[5] < 10: Second = u'0' + Second return DayName + u' ' + Day + u'.' + Month + u'.' + Year + u' à ' + Hour + u':' + Minute + u':' + Second def AddRecListe(PageLis, PageNb, Bandeau): global RecentListeNb, RecentListePageLis, RecentListePageNb, RecentListeBandeau RecentListePageLis[RecentListeNb] = PageLis RecentListePageNb[RecentListeNb] = PageNb RecentListeBandeau[RecentListeNb] = Bandeau RecentListeNb += 1 def Main(): #Ajouter ICI la liste des portails à mettre à jour avec la fonction AddRecListe(PageLis, PageNb, Bandeau), même paramètres que pour la fonction Liste. while True: try: Time = time.localtime(time.time()) wikipedia.output(PrintTime(Time)) # A bazarder si ça vous chante. if Time[4] == 0: wikipedia.output(u'######################### BOT : MISE À JOUR DE ' + str(Time[3]).encode('utf-8') + u':' + str(Time[4]).encode('utf-8') + u' #########################') Ratissage() for i in range(0,RecentListeNb,1): Liste(RecentListePageLis[i], RecentListePageNb[i], RecentListeBandeau[i]) if Time[3] == 9 or Time[3] == 18: # à neuf heures ou dix-heures. MajPortails() wikipedia.output(u'############################ FIN DE LA MISE À JOUR ############################') wikipedia.output(PrintTime(time.localtime(time.time()))) time.sleep(60 - time.localtime(time.time())[5]) except: time.sleep(5) if __name__ == "__main__": Main()
[modifier] Discussion
[modifier] Interwiki
auteur : Catalyse (d · c · b) | Création : 29 Juin 2007 | Dernière modification : 29 Juin 2007 23h59 |
[modifier] Descriptif
Il s'agit d'un ensemble de modifications sur les fichiers replace.py et pagefromfile.py qui permettent de créer et de mettre à jour un log des modifications des liens Interwiki. Ce log se trouve sur : Projet:Bot/Interwiki
Une fois que vous aurez effectué les modifications ci-dessous, votre Bot devrait créer lui-même sa sous-pages de Projet:Bot/Interwiki
[modifier] Code
Vous devez tout d'abord créer un fichier, dans le même répertoire que celui de interwiki.py, nommé config_log_iw.py et contenant :
#!/usr/bin/python # -*- coding: utf-8 -*- login_bot = 'Pseudo/Login de votre Bot' login_dress = 'Votre Pseudo/login' pages_crees = False
Aux alentours de la ligne 224 juste après "import socket", ajouter :
import config_log_iw import pagefromfile import httplib
Aux alentours de la ligne 962 juste après
# disabled graph drawing for minor problems: it just takes too long #if notUpdatedSites != [] and config.interwiki_graph: # # at least one site was not updated, save a conflict graph # self.createGraph() # don't report backlinks for pages we already changed if globalvar.backlink: self.reportBacklinks(new, updatedSites)
Ajouter :
def mettre_log_iw_a_jour(self): text = self.mods1.encode('utf-8') y = re.compile('Retire:', re.VERBOSE) b = y.search(text) if b == None: return True page = self.originPage.aslink(True).encode('utf-8') z = re.compile('\[\[', re.VERBOSE) a = z.search(text) if a != None: text = z.sub(r'[[:', text) remplacement2 = '\n|- \n| width=300px |'+page+'\n|'+text+'\n| width=70px style="text-align:center;"|Fait \n| width=70px style="text-align:center;"|\n <noinclude>Add</noinclude>' conn = httplib.HTTPConnection('fr.wikipedia.org') conn.request("GET", "/w/index.php?title=Projet:Bot/Interwiki/" + config_log_iw.login_bot + "&action=edit") response = conn.getresponse() data = response.read() i1 = re.search('<textarea[^>]*>', data).end() i2 = re.search('</textarea>', data).start() data2 = data[i1:i2] h = codecs.open('log_interwiki_bot.txt', 'w+') h.write("{{-start-}}\n"+data2) h.write("\n{{-stop-}}") h.close() arg1 = ['-file:log_interwiki_bot.txt', '-force'] pagefromfile.remplace_text('log_interwiki_bot.txt', '<noinclude>Add</noinclude>', remplacement2) pagefromfile.remplace_text('log_interwiki_bot.txt', '"', '"') pagefromfile.remplace_text('log_interwiki_bot.txt', '<noinclude>\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'</noinclude>','<noinclude>\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'</noinclude>') pagefromfile.main(arg1)
Aux alentours de la ligne 1090, juste après
# Nothing more to do break wikipedia.output(u"NOTE: Updating live wiki...") timeout=60 while 1: try:
Ajouter :
self.mods1 = mods self.mettre_log_iw_a_jour()
Enfin, aux alentours de la ligne 1421, juste après
def readWarnfile(filename, bot): import warnfile reader = warnfile.WarnfileReader(filename) # we won't use removeHints (hints, removeHints) = reader.getHints() pages = hints.keys() for page in pages: # The WarnfileReader gives us a list of pagelinks, but titletranslate.py expects a list of strings, so we convert it back. # TODO: This is a quite ugly hack, in the future we should maybe make titletranslate expect a list of pagelinks. hintStrings = ['%s:%s' % (hintedPage.site().language(), hintedPage.title()) for hintedPage in hints[page]] bot.add(page, hints = hintStrings) #=========== globalvar=Global() if __name__ == "__main__": try:
Ajouter :
if config_log_iw.pages_crees == False: remplacement1 = '=== [[Utilisateur:'+config_log_iw.login_bot+'|Bot:'+config_log_iw.login_bot+']] Dresse par [[Utilisateur:'+config_log_iw.login_dress+'|'+config_log_iw.login_dress+']]===\n{| class="wikitable" width=100%\n|-\n! width=300px | Page\n!Erreur Renvoye par le Bot\n! width=70px style="text-align:center;"|Etat (Bot)\n! width=70px style="text-align:center;"|Etat (Verif){{/'+config_log_iw.login_bot+'}}\n|}\n\nadd' conn = httplib.HTTPConnection('fr.wikipedia.org') conn.request("GET", "/w/index.php?title=Projet:Bot/Interwiki&action=edit") response = conn.getresponse() data = response.read() i1 = re.search('<textarea[^>]*>', data).end() i2 = re.search('</textarea>', data).start() data2 = data[i1:i2] h = codecs.open('interwiki.tmp', 'w+') h.write("{{-start-}}'''Projet:Bot/Interwiki'''\n"+data2) h.write("\n{{-stop-}}") h.close() arg1 = ['-file:interwiki.tmp', '-force'] pagefromfile.remplace_text('interwiki.tmp', '"', '"') pagefromfile.remplace_text('interwiki.tmp', 'add', remplacement1) pagefromfile.main(arg1) os.remove('interwiki.tmp') g = codecs.open('log_interwiki_bot.txt', 'w+', 'utf-8') g.write('{{-start-}}\n\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'\n<noinclude>Add</noinclude> \n{{-stop-}}') g.close() arg1 = ['-file:log_interwiki_bot.txt'] pagefromfile.main(arg1) pagefromfile.remplace_text('config_log_iw.py', 'pages_crees = False', 'pages_crees = True')
Aux alentours de la ligne 48, juste après
__version__='$Id: pagefromfile.py,v 1.37 2007/06/14 10:31:27 wikipedian Exp $' import wikipedia, config import re, sys, codecs
Ajoutez :
import os
Aux alentours de la ligne 209, juste après
except AttributeError: wikipedia.output(u'\nStart or end marker not found.') return 0, None, None try: title = titleR.search(contents).group(1) except AttributeError: wikipedia.output(u'\nNo title found - skipping a page.') return 0, None, None else: return location.end(), title, contents
Ajoutez
def remplace_text(fichier, cherche, remplace): """ remplace un texte dans un fichier """ c_cherche = re.compile(cherche) curseur = open(fichier, 'r') try: curseur_ecriture = open('%s.tmp' % fichier, 'w') curseur_ecriture.write( codecs.BOM_UTF8 ) try: for line in curseur.readlines(): line = re.sub(c_cherche, remplace, line) curseur_ecriture.write(line) finally: curseur_ecriture.close() finally: curseur.close() # renommage os.rename(fichier, '%s~' % fichier) os.rename('%s.tmp' % fichier, fichier
[modifier] Discussion
File "interwiki.py", line 1025 def replaceLinks(self, page, newPages, bot): ^ IndentationError: unindent does not match any outer indentation level
Ca me donne cette erreur après les modifications Alecs.y (disc. - contr.) 5 avril 2008 à 16:36 (CEST)
[modifier] getContrib
auteur : ILJR (d · c · b) | Création : 05/04/2008 | Dernière modification : |
[modifier] Descriptif
Récupère la liste des pages (une seule ligne par page) modifiées par un utilisateur dans un fichier.
Avec l'option write_num indique en plus le nombre d'edit de cette page. L'option condition qui devrait permettre de filtrer les pages avec un texte contenu dans la page ne fonctionne pas.
[modifier] Code
# -*- coding: utf-8 -*- import wikipedia import sgmllib class getContrib(sgmllib.SGMLParser): "A simple parser class." def parse(self, s): "Parse the given string 's'." self.cpt_div = -1 self.open_li = 0 self.cpt_a = 0 self.href = '' self.feed(s) self.close() def __init__(self, user, step=5000, condition=''): "Initialise an object, passing 'verbose' to the superclass." sgmllib.SGMLParser.__init__(self) self.site = wikipedia.getSite() self.name = user self.unique_page = {} self.condition = condition self.data = '' self.address = self.site.contribs_address(self.name,limit=step) self.do(self.address) def do(self, address): self.data = self.site.getUrl(address) self.address = '' self.parse(self.data) if address != self.address: self.do(self.address) def start_li(self, attributes): if self.cpt_div == 0: self.open_li = 1 self.cpt_a = 0 def end_li(self): if self.cpt_div == 1: self.open_li = 0 def start_a(self, attributes): self.cpt_a += 1 sp = 0 href = '' for name, value in attributes: if name == "href" and value.find("dir=prev") == -1 and value.find("offset") != -1: href = value if name == "title": Ok = 1 if self.cpt_a == 3: Ok = Ok * 1 else: Ok = 0 if self.condition == '' or self.data.find(self.condition) != -1: Ok = Ok * 1 else: Ok = 0 if Ok == 1: print u"Page : %s" % value if self.unique_page.has_key(value): self.unique_page[value] += 1 else: self.unique_page[value] = 1 if value == "Special:Contributions": sp = 1 if sp == 1 and href != '' and self.address == '': self.address = href def start_div(self, attributes): if self.cpt_div == -1: for name, value in attributes: if name == "id": if value.find("bodyContent") != -1: self.cpt_div = 0 else: self.cpt_div += 1 def end_div(self): if self.cpt_div > -1: self.cpt_div -= 1 def write_unique_page(self, NomFic, write_num=0): f = open(NomFic, "wt") print "nb_elem = %d" % len(self.unique_page) for k, v in self.unique_page.iteritems(): P = wikipedia.Page(self.site, k) f.write(P.urlname()) if write_num == 1: f.write(" : %d" % v) f.write("\n") f.close(); def main(): C = getContrib("ILJR", 500, u"Mod%C3%A8le:L%C3%A9gifrance") C.write_unique_page("UCL.txt", 0) if __name__ == "__main__": try: main() finally: wikipedia.stopme()
[modifier] Discussion
Cette classe n'est pas finie et contient quelques bugs. Par exemple si je précise un paramètre limit supérieur au nombre d'edit de l'utilisateur, j'ai une erreur alors que si ce nombre est inférieur il n'y a aucun problème.
J'ai des soucis dans ce code et d'une façon générale avec la gestion de l'UTF-8 et de l'ascii qui provoque des erreurs à l'exécution. Par exemple, le fichier résultat contient les url des pages (« Mod%C3%A8le:L%C3%A9gifrance ») et pas leur titre (« Modèle:Légifrance ») à cause des caractères accentués. Je compte creuser la question mais si quelqu'un avait la solution cela m'arrangerait.