Chronobot
Chronobot est un bot programmé en langage Python et qui agit sur des pages Wikipast. Il permet de regrouper tous les événements qui se sont passés en une année dans une même page
Fonctionnement
Chronobot va d'abord effectuer un scan (correction(s): scat ) sur l'ensemble des pages biographiques crées (correction(s): créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues ) par les élèves du cours "Humanités Digitales" (2017). Il effectue ensuite un scan (correction(s): scat ) sur tous les événements relevés dans chaque page et en stocke la date (sous forme AAAA.MM.JJ) et la description dans une liste. Une fois cette liste en main, il crée une page pour chaque jour différent. Pour des raisons pratiques, il est plus logique de n'avoir qu'une seule page par année avec tous les événements relevés durant cette année classés chronologiquement. Pour ce faire, au lieu d'agir directement sur l'url (correction(s): urf ) de la page, Chronobot redirige chaque lien d'un jour vers l'url (correction(s): urf ) de l'année correspondante. Enfin, il y écrit l'événement en bas de la page de l'année correspondante. Quand il finit le scan (correction(s): scat ), il ordonne tous les événements des pages années qui ont été modifiées. La gestion des doublons est résolue ultérieurement.
Généralités
- Concepteurs : Arnau Albà Jacas, Sonia Bouchiba, Jonathan Charrière, Sébastien Morel, Aurélien Verdier.
- UserName : ChronoBOT
Liste des fonctions
Fonctions principales
- select_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
) parcourt les différentes pages sur une séléection (correction(s): sélection ) précise de Users (ceux du cours SHS) et en retourne les pages crées (correction(s): créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues ) sous formes de chaînes brutes (String). Les images (.png (correction(s): )) sont ôtées ainsi que
- recherchedates (correction(s):
).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en argument une page donnée (string) et en sort une liste année/événement
- modify (correction(s):
)_links (correction(s): linos, lins ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) modifie toutes les pages des dates pour qu'elles soient redirigées (correction(s): ) vers la page de l'année.
- create (correction(s): croate
)_new_site.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) crée une page Wikipast avec le contenu donné
- order (correction(s): corder, border, orner, arder, onder
).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) ordonne une page dans l'ordre chronologique et order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) effectue order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) sur toutes les pages une fois qu'elles sont toutes écrites.
- place_evenement (correction(s):
).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) écrit un événement dans une page.
- event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
) gère les doublons en comparant deux strings-évenements (correction(s): évènements, événements ) caractère par caractère. Il considère ainsi deux évenements (correction(s): évènements, événements ) identiques s'ils contiennent les mêmes suites de caractères. Il ne tient pas compte des virgules (,), points (.) et espaces ( ) s'ils sont différents dans les deux strings.
Fonctions secondaires
- retrieve (correction(s): retriever
)_content.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en input le nom d'une page et retourne tout le texte contenu en syntaxe wiki (correction(s): kiki, tiki ).
- split (correction(s): salit
)_date.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en input une date 'aaaa (correction(s): ).mm.jj (correction(s): je, j, jà )' et retourne une array (correction(s): ) [année, mois, jour].
Exemples de pages créées
- 1990.02.23 -> redirection (correction(s):
) vers 1990
- 1990.06 -> redirection (correction(s):
) vers 1990
Critiques et faiblesses du bot
- Optimisation du code (plusieurs minutes pour s'exéctuer (correction(s):
) sur toutes les pages.)
- Si une année a déjà été crée avant notre bot et une phrase a été ajoutée, par exemeple (correction(s): exemple
) "Grande année" redigirigée (correction(s): ) vers "1995" comportait une phrase commançant (correction(s): commandant, commençant ) par "Grande année". Pour résoudre ce problème, deux solutions sont enbisageables (correction(s): envisageables ) : la première, assez radicale, est d'effacer la ligne en question dans la page Wikpast. La seconde (celle choisie, plus douce) est
- Gestion des doublons : pourrait être amélioré dans la comparaison de deux événements similaires. Actuellement, seules deux événements écrits exactement pareils ne sont pas dédoublés (par la fonction event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
)), mais on pourrait imaginer qu'un événement du type Mariage qui serait écrit comme "A se marie avec B" dans la page de A et "B se marie avec A" dans la page de B, et qui serait donc relevé deux fois.
- Normalisation des dates sur les pages de la database (correction(s):
) (car par exemple une inversion mois-jour pas prise en compte actuellement)
- Classement chronologique des événements dans les pages de la database (correction(s):
)
- Section "Mois" dans les pages années
Scheduling
Tant que le nombre d'utilisateurs reste en accord avec le nombre d'étudiants dans le cours "Humanités Digitales" de l'EPFL, le bot va tourner une fois par semaine. Si wikiapst (correction(s): ) devient un site ouvert au public, il faudra éventuellement le lancer plus fréquemment.
Code source
==main_one (correction(s): ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une )_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) et main.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )== ===main_one (correction(s): ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une )_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site from <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_site from <span style="color:red">modify</span> (correction(s): <span style="color:green"> </span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins </span>) import <span style="color:red">modify</span> (correction(s): <span style="color:green"> </span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins </span>) from place_<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) import place_<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) from event_not_in_page import event_not_in_page from <span style="color:red">recherchedates</span> (correction(s): <span style="color:green"> </span>)2 import <span style="color:red">recherchedates</span> (correction(s): <span style="color:green"> </span>)2 #ajouter ici les autres fonctions dont on aura besoin def main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>)_page(page): page=page.replace(" ","_") #modifie les dates pour rediger vers une année <span style="color:red">modify</span> (correction(s): <span style="color:green"> </span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins </span>)(page) #renvoie un <span style="color:red">array</span> (correction(s): <span style="color:green"> </span>) de deux colonnes: une colonne de dates et une colonne d'evenements elements=<span style="color:red">recherchedates</span> (correction(s): <span style="color:green"> </span>)2(page) for element in elements: <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) = element[1] date = element[0] annee = date[:4] #cree le site si il existe pas encore <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_site(annee) if event_not_in_page(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)): content=place_<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)) <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site(annee,content)
===main.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===
''' Alors ça c'est le main. Si on le lance ça crée toutes las pages année normalement. ''' from select_page import select_page from main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>)_page import main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>)_page import datetime from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo </span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo </span>) page_list=select_page() i=0 years_modified=[] for page in page_list: print('Je suis en train de faire la page: '+page) print("J'ai fait un "+str(i/len(page_list)*100)+'%') years_modified=years_modified+main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>)_page(page) i=i+1 print("j'ai fini, il me reste qu'à tout ordonner") #ici il ordonne toutes les pages, parce que la fonction place_<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) #met les evenements juste à la fin de la page <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo </span>)(years_modified) now = datetime.datetime.now() year=str(now.year) month=str(now.month) day=str(now.day) hour=str(now.hour) minute=str(now.minute) if len(month)==1: month='0'+month if len(day)==1: day='0'+day if len(hour)==1: hour='0'+hour if len(minute)==1: minute='0'+minute fichier=open('lastdate.txt','w') fichier.write(year+'-'+month+'-'+day+'T'+hour+':'+minute+':00Z') fichier.close()
==select_pages.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
Code source
# -*- coding: utf-8 -*- #return a list of str containing <span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo </span>) the name of wikipast page, without the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>) beginin with "Fichier:" or the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>) beginin with 4 number (ex:"1945") #only pages changed by user in the "whiteliste.txt" and done AFTER the date write in "lastdate.txt" are given #to change the "lastdate.txt", please put those line where needed : #if needed, it strated with "2017-02-05T16:00:00Z" import requests from bs4 import BeautifulSoup def select_page(): baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green"> </span>).ch/wikipast/' fichier=open('whiteliste.txt', 'r') protected_logins=fichier.read() fichier.close() protected_logins=protected_logins.<span style="color:red">split</span> (correction(s): <span style="color:green">salit </span>)('\n') protected_logins=protected_logins[:(len(protected_logins)-1)] fichier=open('lastdate.txt', 'r') depuis_date=fichier.read() fichier.close() liste_pages=[] for user in protected_logins: result=requests.post(baseurl+'api.php?action=query&list=usercontribs&ucuser='+user+'&format=xml&ucend='+depuis_date) soup=BeautifulSoup(result.content,'html.parser') for primitive in soup.usercontribs.findAll('item'): title=primitive['title'] if title[0:8]!='Fichier:': if not title[0:3].isnumeric(): liste_pages.append(title) liste_pages=list(set(liste_pages)) return liste_pages
Whitelist
Frederickaplan Maud Vbuntinx Testbot SparqlBot IB SourceBot PageUpdaterBot Orthobot BioPathBot ChronoBOT Amonbaro AntoineL AntoniasBanderos Arnau Arnaudpannatier Aureliver Brunowicht Burgerpop Cedricviaccoz Christophe Claudioloureiro Ghislain Gregoire3245 Hirtg Houssm Icebaker JenniCin JiggyQ JulienB Kl Kperrard Leandro Kieliger Marcus Martin MatteoGiorla Mireille Mj2905 Musluoglucem Nacho Nameless Nawel O'showa PA Qantik QuentinB Raphael.barman Roblan11 Romain Fournier Sbaaa Snus Sonia Tboyer Thierry Titi Vlaedr Wanda
== recherchedates (correction(s):
)2.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
) ==
import requests from bs4 import BeautifulSoup from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content def <span style="color:red">recherchedates</span> (correction(s): <span style="color:green"> </span>)2(page_name): x=str(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(page_name)) x=x.<span style="color:red">split</span> (correction(s): <span style="color:green">salit </span>)("\n") dates=[] for i in x: d_start=i.find("[[") if (d_start!=-1) and i[d_start+2:d_start+6].isnumeric(): d_start=d_start+2 d_end=i[d_start:].find("]]")+d_start date=i[d_start:d_end] d_start=d_start-2 even='*'+i[d_start:] dates.append([date,even]) return(dates)
==modify (correction(s): )_links (correction(s): linos, lins ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
''' cette fonction prend en input le nom d'une page. Pour toutes les dates de type [[AAAA/MM/JJ]], elle crée le lien de <span style="color:red">redirection</span> (correction(s): <span style="color:green"> </span>) vers la page de l'année. Pour les dates de type [[AAAA]] elle ne fait rien puisqu'elles sont déjà un lien vers l'année ''' import requests from bs4 import BeautifulSoup from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content months=["Janvier","F.C3.A9vrier","Mars","Avril","Mai","Juin","Juillet","Ao.C3.BBt","Septembre","Octobre","Novembre","D.C3.A9cembre"] def <span style="color:red">modify</span> (correction(s): <span style="color:green"> </span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins </span>)(page_name): ############### ############### #<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>) dates text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(page_name) text=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit </span>)("\n") dates=[] for line in text: d_start=line.find("[[") if (d_start!=-1) and line[d_start+2:d_start+6].isnumeric(): d_start=d_start+2 d_end=line[d_start:].find("]]")+d_start date=line[d_start:d_end] if len(date)!=4: dates.append(date) ############### ############### #<span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>) pages with <span style="color:red">redirection</span> (correction(s): <span style="color:green"> </span>) code user = "ChronoBOT" passw = "sajas2017" baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green"> </span>).ch/wikipast/' summary='ChronoBOT page creation' # Login request payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm login_token=r1.json()['query']['tokens']['logintoken'] payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token} r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies) #get edit token2 params3='?format=json&action=query&meta=tokens&continue=' r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies) edit_token=r3.json()['query']['tokens']['csrftoken'] edit_cookie=r2.cookies.copy() edit_cookie.update(r3.cookies) for date in dates: year=date[:4] if(int(date[5:7])<13): month=months[int(date[5:7])-1] content="#REDIRECT [["+year+"#"+month+"]]" else: content="#REDIRECT [["+year+"]]" # save action payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':date,'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
==create (correction(s): croate )_site.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
''' cette fonction prend en input une année, et crée un site en blanc pour cette année Si le site existe déjà, il ne fait rien ''' import requests def <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_site(year): #check if year is a four digit number year=str(year) if(len(year)!=4)or not(year.isnumeric()): return user = "ChronoBOT" passw = "sajas2017" baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green"> </span>).ch/wikipast/' summary='ChronoBOT page creation' #check if page already exists if(requests.get('http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green"> </span>).ch/wikipast/index.php/'+year)).status_code!=404: return # Login request payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm login_token=r1.json()['query']['tokens']['logintoken'] payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token} r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies) #get edit token2 params3='?format=json&action=query&meta=tokens&continue=' r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies) edit_token=r3.json()['query']['tokens']['csrftoken'] edit_cookie=r2.cookies.copy() edit_cookie.update(r3.cookies) content="" # save action payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':year,'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
==order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) et order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )== ===order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===
from smaller_than import smaller_than def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)(text):#ça ordonne un text text1=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit </span>)('\n') #separate events from other useless lines in the page newtext=[] craptext=[] for line in text1: if (line[:3]=='*[[') and (line[3:7].isnumeric()): newtext.append(line) else: craptext.append(line) #case where page is empty, only has <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une </span>) line in it, or only has crap in it if len(newtext)<2: return text #check for repeated lines provisional=[] for line in newtext: if line not in provisional: provisional.append(line) newtext=provisional ok=0 while(ok==0): ok=1 for i in range(len(newtext)-1): pos1 = newtext[i].find(']]') date1 = newtext[i][3:pos1] pos2 = newtext[i+1].find(']]') date2 = newtext[i+1][3:pos2] if not smaller_than(date1,date2): ok=0 event=newtext[i] newtext[i]=newtext[i+1] newtext[i+1]=event newtext='\n'.join(newtext)+'\n'+'\n'.join(craptext) return newtext
===order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===
from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>) from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content from <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo </span>)(years):#ça ordonne toutes les annees done=[] for year in years: if year not in done: print('I am ordering page '+year) content=<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder </span>)(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(year)) <span style="color:red">create</span> (correction(s): <span style="color:green">croate </span>)_new_site(year,content) done.append(year)
==place_evenement (correction(s): ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content def place_<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)): #format annee: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>)' #format dans wikipast: '*[[<span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà </span>)]] (...)' seulement le début du format nous intéress return <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(annee)+'\n'+<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)
==event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
''' cette fonction prend en input une annee et un <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>). Si cet <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) est déja dans la page de l'année il renvoie 0 Si il n'est pas encore dans la page de l'année il renvoie 1 ''' from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content def event_not_in_page(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)): text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(str(date)).replace(' ','') text=text.replace(',','') text=text.replace('.','') pos=<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>).find(']]') <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)[pos+2:].replace(' ','') <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>).replace(',','') <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>).replace('.','') if <span style="color:red">evenement</span> (correction(s): <span style="color:green"> </span>) in text: return 0 else: return 1
==retrieve (correction(s): retriever )_content.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
''' cette fonction prend en input le nom d'une page et retourne tout le text qu'il y a dedans, en code <span style="color:red">wiki</span> (correction(s): <span style="color:green">kiki, tiki </span>) ''' import requests from bs4 import BeautifulSoup def <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever </span>)_content(name): baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green"> </span>).ch/wikipast/' result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text, "html.parser") code='' if soup.findAll("text")[0]['bytes']=='0': return code for primitive in soup.findAll("text"): code+=primitive.string return code
==split (correction(s): salit )_date.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
def <span style="color:red">split</span> (correction(s): <span style="color:green">salit </span>)_date(date): #format date: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà </span>)' /!\ la date doit être au format string date=str(date); #on est jamais trop sûr annee=''; mois=''; jour=''; for i in range(len(date)): if(i<4): annee=annee+date[i]; if(i>4 and i<7): mois=mois+date[i]; if(i>7 and i<10): jour=jour+date[i]; return [annee, mois, jour];
==smaller_than.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==
def smaller_than(date1,date2):#need to be format <span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>).mm.dd #a year of format <span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>) is always smaller #case <span style="color:red">aaaa</span> (correction(s): <span style="color:green"> </span>) if(len(date1)==4): return 1 if(len(date2)==4): return 0 #case m1=date1[5:7] d1=date1[8:] m2=date2[5:7] d2=date2[8:] if(m1<m2): return 1 elif(m1>m2): return 0 elif(m1==m2): if(d1<=d2): return 1 else: return 0