1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# coding: utf-8

# --------BAO1 Version: Python-RegEx----------------
# Le programme prend en entrée :
# 1. le nom du répertoire contenant les fichiers xml à traiter
# 2. le code imbriqué dans le nom du fichier servant à préciser quelle rubrique prise en compte (à la une correspond au code 3208 par ex.)
# Le programme extrait le texte dans des balises <title> et <description> et construit en sortie :
# 1. un fichier texte brut 
# 2. un fichier xml structuré
# Ce script est lancé de la manière suivante
# python3 BAO1.py repertoire_corpus(./2019) rubrique(cinema)
# ---------------------------------------

# on essaie d'utiliser le moins de bibliotheque possible
import sys, os, re


def nettoyage(s):
    s1 = re.sub("&lt;.+?&gt;", "", s)
    s2 = re.sub("&#38;&#34;", "\"", s1)
    s3 = re.sub("&#38;&#39;", "'", s2)
    s4 = re.sub("\\xa0", " ", s3)
    return s4

def extr_contenu(input):
    with open(input, 'r') as f:
        contenu = f.read()
    # chercher le pattern ciblé
    # "." correspond a n'importe quel caractere grace a l'option re.DOTALL
    pattern = re.compile(r"<item>.*?<title>.+?</title>.+?<description>.+?</description>", re.DOTALL)
    pattern_group = re.compile(r"<title>(.+?)</title>.+?<description>(.+?)</description>", re.DOTALL)
    # la methode findall ne peut pas etre utilisee avec group()
    # mais il est obligatoire de stocker les contenus entre parentheses pour faire correspondre le titre et la description
    list_contenu = re.findall(pattern, contenu)
    # on l'utilise pour faire boucler le processus de recherche
    for item in list_contenu:
        # capturer respectivement le contenu dans les parentheses
        match = re.search(pattern_group, item)
        titre_raw = match.group(1)
        description_raw = match.group(2)
        titre = nettoyage(titre_raw) + '.'
        description = nettoyage(description_raw)
        if titre not in tit_des:
            tit_des[titre] = []
            tit_des[titre].append(description)
        else:
            tit_des[titre].append(description)

def par_rep(nom_rep, rub_code):
    pattern_rub = re.compile(rf'{rub_code}')
    # parcourir le contenu dans ce repertoire
    for i in os.listdir(nom_rep):
        # print(os.path.join(nom_rep,i))
        # s'il existe des repertoire -> entrer et parcourir le contenu dans ce repertoire
        # if os.path.isdir(i):
        if os.path.isdir(os.path.join(nom_rep,i)):
            par_rep(os.path.join(nom_rep,i), rub_code)
        # pour les fichiers, s'il est fichier xml, on extrait le contenu dans les balises title et description
        elif os.path.isfile(os.path.join(nom_rep,i)):
            if os.path.join(nom_rep,i).endswith('.xml') and re.match(pattern_rub, i):
                print(i)
                extr_contenu(os.path.join(nom_rep,i))

def ecrire_txt(contenu_dico, output):
    with open(output, "a") as f:
        for item in contenu_dico.items():
            f.write(item[0] + "\n")
            for des in item[1]:
                f.write(des + "\n")
            f.write("---------------\n")

def ecrire_xml(contenu_dico, output):
    with open(output, "a") as f:
        f.write("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n")
        f.write("<corpusMonde>\n")
        for item in contenu_dico.items():
            f.write("<item>\n")
            f.write("<titre>" + item[0] + "</titre>\n")
            for des in item[1]:
                f.write("<description>" + des + "</description>\n")
            f.write("</item>\n")
        f.write("</corpusMonde>\n")

def rubiconv(nom): #conversion du nom de rubrique en indicatif chiffré
	corres = {'tout':'0,2-(.*),0|0,57-0,64-823353,0|env_sciences','une':'0,2-3208,1-0,0', 'international':'0,2-3210,1-0,0', 'europe':'0,2-3214,1-0,0', 'societe':'0,2-3224,1-0,0', 'idees':'0,2-3232,1-0,0', 'economie':'0,2-3234,1-0,0', 'actualite-medias':'0,2-3236,1-0,0', 'sport':'0,2-3242,1-0,0', 'planete':'0,2-3244,1-0,0', 'culture':'0,2-3246,1-0,0', 'livres':'0,2-3260,1-0,0', 'cinema':'0,2-3476,1-0,0', 'technologies':'0,2-3546,1-0,0', 'politique':'0,57-0,64-823353,0', 'sciences':'env_sciences'}
	return(corres.get(nom))

if __name__ == "__main__":
    # recevoir 2 arguments dans la ligne de commande
    rep = sys.argv[1]
    rubrique = rubiconv(sys.argv[2])
    # le dictionnaire {titre:[description]} comme variable globale
    tit_des = {}
    # parcourrir le repertoire et extraire le contenu cible dans les fichiers xml
    par_rep(rep, rubrique)
    # ecrire le contenu dans un fichier txt
    ecrire_txt(tit_des, 'sortie_tout.txt')
    # ecrire le contenu dans un fichier xml
    ecrire_xml(tit_des, 'sortie_tout.xml')