Extraction textuelle à partir de fichiers rss dans une arborescence.
La tâche se divise en deux aspects, le parcours de l'arborescence et l'extraction textuelle d'un fil rss.
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
***********
Extraction
def extraction_format(doc, forma):
#Initialistation de la variable prenant le contenu de la sortie xml, avec l'entête et la balise ouvrante du corpus
output_xml="""<?xml version="1.0" encoding="UTF-8"?>\n<corpus>\n"""
#Initialistation de la variable prenant le contenu de la sortie txt
output_txt=""
#Parcours d'un fil rss
for m in re.finditer(forma,doc):
#Attribution des groupes à des variables correspondant au contenu
titre=m.group(1)
desc=m.group(2)
#Concaténation du contenu aux variables des documents, avec formattages respectifs
output_xml+=f'<item>\n<titre>{titre}</titre>\n<description>{desc}</description>\n</item>\n'
output_txt+=f'Titre :\n{titre}\n\nDescription :\n{desc}\n--------\n\n'
#Fermeture de la balise corpus dans la variable de la sortie xml
output_xml+='</corpus>'
#Ecriture de la sortie xml
f=open("extraction_BAO1.xml","w",encoding="UTF-8")
f.write(output_xml)
f.close()
#Ecriture de la sortie txt
f=open("extraction_BAO1.txt","w",encoding="UTF-8")
f.write(output_txt)
f.close()
return output_xml, output_txt
Parcours
def parcours_arborescence_rubrique(fichier,rubrique):
#Utilisation du module path pour créer un objet facilement manipulable
p = Path(fichier)
rub=re.compile(rubrique)
doc=""
#Parcours de l'arborescence
for file in p.iterdir():
if file.is_file():
if re.search(rub,file.name):
f=open(file,"r",encoding="UTF-8")
d="".join(f.readlines())
f.close()
doc+=d
elif file.is_dir():
doc+=parcours_arborescence_rubrique(file,rubrique) #Recusrif
return doc
Programme
def bao1(arbo,rubrique,regex):
doc=parcours_arborescence_rubrique(arbo, rubrique)
xml, txt = extraction_format(doc,regex)
return xml, txt
if __name__=="__main__":
#Regex prenant le contenu des titres et description (en prenant en compte les balises CDATA)
reg=re.compile("<item><title><!\[CDATA\[(.*?)\]\]></title>.*?<description><!\[CDATA\[(.*?)\]\]></description>")
dossier=sys.argv[1]
rubrique=sys.argv[2]
bao1(dossier, rubrique, reg)
commande
python3 bao10py Arbo Rubrique
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
Extraction
open my $input, "<:encoding(UTF-8)",$file;
$/=undef; # par défaut cette variable contient \n
my $ligne=<$input> ;
close($input);
while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
my $titre=&nettoyage($1);
my $description=&nettoyage($2);
print $output "Titre : \n$titre \n";
print $output "Description :\n$description \n";
print $output "----------------------------\n";
print $output2 "<item>\n<titre>$titre</titre>\n<description>$description</description>\n</item>\n"</code></pre>
#fonction de nettoyage permettant de retirer les balises CDATA
sub nettoyage {
my $texte=shift @_;
$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
$texte.=".";
$texte=~s/\.+$/\./;
return $texte;
Parcours
sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
#Précaution pour éviter les boucles infinies (les dossier cachés . et .. étant pris en compte par perl
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
print "On entre dans le REPERTOIRE : $file \n";
&parcoursarborescencefichiers($file); #recursif
print "On sort du REPERTOIRE : $file \n";
}
if (-f $file) {
if ($file =~ /$RUBRIQUE.+\.xml$/)
Programme :
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;}
my $rep="$ARGV[0]";
my $RUBRIQUE="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
open my $output, ">:encoding(UTF-8)","pre-corpus-titre-description.txt";
open my $output2, ">:encoding(UTF-8)","pre-corpus-titre-description.xml";
print $output2 "< ?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------
print $output2 "</corpus>\n";
close $output;
close $output2;
commande
perl bao1.pl Arbo Rubrique