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
100
101
102
103
104
105
106
107
108
109
110
111
|
#/usr/bin/perl
# --------BAO1 Version:Module XML::RSS----------------
# 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
# perl BAO1_xml_rss.pl repertoire_corpus(./2019) rubrique(3208)
#-----------------------------------------------------------
################################ programme principal
use XML::RSS;
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
$rep=~ s/[\/]$//;
my $i=0;
#un hash de doublons
my %doublons;
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep); #recurse!
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
exit;
#----------------------------------------------
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) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
if (-f $file) {
if ($file=~/$rubrique.+\.xml$/) {
print $i++," : $file \n";
my $rss=new XML::RSS;
#parsefile ($file, \%options):analyser un fichier
#eval():une fonction pour vérifier s'il y a des erreurs de syntaxe ou d'exéxutation, en cas d'erreur, le message d'erreur est assigné
eval {$rss->parsefile($file); };
if( $@ ) {
$@ =~ s/at \/.*?$//s; # remove module line number
print STDERR "\nERROR in '$file':\n$@\n";
}
else {
foreach my $item (@{$rss->{'items'}}) {
my $description=$item->{'description'};
my $titre=$item->{'title'};
my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
#supprimer les doublons:
if (exists $doublons{$titrenettoye}) {
$doublons{$titrenettoye}++;
}
else {
$doublons{$titrenettoye}=1;
print OUT "$titrenettoye\n";
print OUT "$descriptionnettoye\n";
print OUTXML "<article>\n";
print OUTXML "<titre>$titrenettoye</titre>\n";
print OUTXML "<description>$descriptionnettoye</description>\n";
print OUTXML "</article>\n";
}
}
}
}
}
}
}
sub nettoyage {
#@_ : my ($titre,$description) = @_
my $titre = $_[0];
my $description = $_[1];
#pour faciliter la segmentation au plus tard, on ajoute un point
$titre = $titre . "." ; # $titre .= ".";
$description =~ s/&#39;/'/g; #$description = $description . ".";
return $titre, $description;
}
##################### sous-programmes (sub)
sub nettoyage {
# @_ liste recu, pour acceder a des liste, on utilise $
# on veut que les variables soit utilisees ici, my est obligatoire
# shift/shift(@_) : on prend le premier element d'une liste et on le renvoie
my $titre=shift(@_);
my $description=shift(@_);
my $titre=$_[0];
my $description=$_[1];
# foreach my $element(@_){
# }
$description=~s/<.+?>//g;
$titre=~s/<.+?>//g;
$description=~s/&"/"/g;
$titre=~s/&"/"/g;
$description=~s/&'/'/g;
$titre=~s/&'/'/g;
# $ sert a reconnaitre la fin de chaine
$titre=~s/$/\./g;
return $titre,$description;
}
|