Problème de comptage boucle if
Résolu
ellowdiiie
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
Bonjour,
Bonjour,
après 3 jours de recherches intensives, je ne trouve pas la solution de mon problème. J'ai un fichier .sh que j'exécute sur des fichiers .html. Ce premier recherche le nombre d'articles (écrits par des chercheurs) situés sur la page téléchargée en html. Chaque article est listé en commençant <LI>. Seulement, dans cette liste, il y a des sous-listes marquées par <UL> et </UL> au début et à la fin. Ma boucle qui doit les détecter repère bien les débuts de sous-liste, mais pas les fins. C'est comme si elle réinitialisait la valeur de la variable d'entrée dans une sous-liste.
Si qqn sait quel est le problème dans ma boucle, ça me serait d'une extrême aide !
Pour faire tourner ce fichier .sh sur le .html, j'utilise :
et le fichier qui sera créé s'appellera publis_short.csv
Le problème, c'est qu'en allant sur la page web https://ideas.repec.org/e/paa6.html on voit bien que ce chercheur n'a publié que 34 articles. Le programme en compte 54. En fait, il ne compte pas le premier des sous-listes, mais il compte (à tort) les suivants.
Merci beaucoup !
Cordialement
Bonjour,
après 3 jours de recherches intensives, je ne trouve pas la solution de mon problème. J'ai un fichier .sh que j'exécute sur des fichiers .html. Ce premier recherche le nombre d'articles (écrits par des chercheurs) situés sur la page téléchargée en html. Chaque article est listé en commençant <LI>. Seulement, dans cette liste, il y a des sous-listes marquées par <UL> et </UL> au début et à la fin. Ma boucle qui doit les détecter repère bien les débuts de sous-liste, mais pas les fins. C'est comme si elle réinitialisait la valeur de la variable d'entrée dans une sous-liste.
Si qqn sait quel est le problème dans ma boucle, ça me serait d'une extrême aide !
Pour faire tourner ce fichier .sh sur le .html, j'utilise :
cd /Users/nanana/Desktop/essai
for u in `cat liste_url_short.txt`
do nomfic=`echo $u | awk -F '/' '{print $5}'`
wget $u
./analyse_wp2_copie.sh $nomfic; done >publis_short.csv
et le fichier qui sera créé s'appellera publis_short.csv
Le problème, c'est qu'en allant sur la page web https://ideas.repec.org/e/paa6.html on voit bien que ce chercheur n'a publié que 34 articles. Le programme en compte 54. En fait, il ne compte pas le premier des sous-listes, mais il compte (à tort) les suivants.
#!/bin/bash
# principe :
# les articles commencent par <A NAME=articles><HR><H4>Articles<\/H4><OL>
# et se terminent par </OL>
# entre les 2 lignes, on compte les <LI>, mais il faut éliminer
# les liste intermédiaires (uniquement des UL ?)
# une ligne peut contenir 2 balises parmi les balises recherchées
fic=$1
nbart=0
nbchp=0
nbbk=0
nbsft=0
in_art=''
# in_art = 1 si on est dans le bloc Articles
in_chp=''
in_bk=''
in_sft=''
# in_liste_art = 1 si on est dans une sous liste article <UL> ....</UL>
in_liste_art=''
in_liste_chp=''
in_liste_bk=''
in_liste_sft=''
auteur=`grep '<TITLE>' $fic |sed -e 's| <TITLE>||' -e 's| at IDEAS</TITLE>||'`
idauteur=${fic%.*l}
while read line
do
# articles
if [ "$in_art" != "1" ]
then
in_art=`echo $line | awk '/id="articles-body"><ol>/ {print "1"}'`
else
in_liste_art=`echo $line | awk '/<UL>/ {print "1"}'`
end_art=`echo $line | awk '/<\/ol><\/div><\/div>/ {print "1"}'`
if [ "$end_art" != "1" ]
then
if [ "$in_liste_art" = "1" ]
then
end_liste=`echo $line | awk '/<\/UL>/ ~ $0 && /.*<UL>.*/ !~ $0 {print "1"}'`
if [ "$end_liste" = "1" ]
then
in_liste_art=''
fi
fi
if [ "$in_liste_art" != "1" ]
then
li_art=`echo $line | awk '/<LI class="downgate">/ || /<LI class="downnone">/ || /<LI class="downfree">/ {print "1"}'`
if [ "$li_art" = "1" ]
then
nbart=`expr $nbart + 1`
fi
in_liste_art=`echo $line | awk '/<UL>/ {print "1"}'`
fi
else
in_art=''
fi
fi
done < $fic
echo "$idauteur;$auteur;$nbart;$nbbk;$nbchp;$nbsft"
Merci beaucoup !
Cordialement
A voir également:
- Problème de comptage boucle if
- Comptage de pas gratuit - Télécharger - Sport
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Télé samsung s'éteint et se rallume en boucle - Forum Téléviseurs
- Boucle excel sans macro - Forum Excel
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
3 réponses
Salut,
Pas le temps de déchiffrer ton script ;-\
Peux-tu nous dire quel est le résultat attendu par rapport à la page donnée en lien ?
Pas le temps de déchiffrer ton script ;-\
Peux-tu nous dire quel est le résultat attendu par rapport à la page donnée en lien ?
Salut,
Sans rentrer dans le détail de ton script, ta façon de détecter une sous-liste est suspecte.
Suppose 3 lignes :
A chaque ligne, tu exécutes :
--> Ligne 1 : in_liste_art passe à "1". Normal, on est dans une sous liste.
--> Ligne 2 : in_liste_art passe à "". Pas normal car on est encore dans la sous liste.
Personnellement, je serai parti sur une autre stratégie en passant par un fichier intermédiaire :
- supprimer les parties du fichier html qui encadre les articles. Tu obtiens ainsi un fichier qui ne contient que le nécessaire. Ton script ne passe donc pas son temps à parser des lignes pour rien ;)
- supprimer tout ce qui se trouve entre les patterns <UL> et </UL>. Il serait du coup peut être plus simple pour ça de supprimer auparavant les retours chariot...à voir...
- enfin compter le nombre de balises <LI> restantes ^^
++
Sans rentrer dans le détail de ton script, ta façon de détecter une sous-liste est suspecte.
Suppose 3 lignes :
<UL> blabla <\UL>
A chaque ligne, tu exécutes :
in_liste_art=`echo $line | awk '/<UL>/ {print "1"}'`
--> Ligne 1 : in_liste_art passe à "1". Normal, on est dans une sous liste.
--> Ligne 2 : in_liste_art passe à "". Pas normal car on est encore dans la sous liste.
Personnellement, je serai parti sur une autre stratégie en passant par un fichier intermédiaire :
- supprimer les parties du fichier html qui encadre les articles. Tu obtiens ainsi un fichier qui ne contient que le nécessaire. Ton script ne passe donc pas son temps à parser des lignes pour rien ;)
- supprimer tout ce qui se trouve entre les patterns <UL> et </UL>. Il serait du coup peut être plus simple pour ça de supprimer auparavant les retours chariot...à voir...
- enfin compter le nombre de balises <LI> restantes ^^
++
Bonjour,
Oui, c'est une bonne idée. Le problème, c'est qu'il y a une section article, une section book, une chapters, et une software à qui je dois appliquer le traitement. Je dois donc garder les 4, et ensuite mettre des repères de début et fin de ces sections. Mais je vais supprimer le reste, et les sous-listes, ça devrait débloquer le problème. merci !
Oui, c'est une bonne idée. Le problème, c'est qu'il y a une section article, une section book, une chapters, et une software à qui je dois appliquer le traitement. Je dois donc garder les 4, et ensuite mettre des repères de début et fin de ces sections. Mais je vais supprimer le reste, et les sous-listes, ça devrait débloquer le problème. merci !
Re-
Tiens une approche tout autre, si j'ai bien compris ce que tu voulais faire, qui utilise le formatage web et non le code html...
Pour récupérer les données (Nom, Prénom(s) et ID) :
Pour récupérer le nombre d'articles :
Tiens une approche tout autre, si j'ai bien compris ce que tu voulais faire, qui utilise le formatage web et non le code html...
Pour récupérer les données (Nom, Prénom(s) et ID) :
$ w3m -dump -T text/html paa6.html | sed -n '/^Personal /,/^Affiliation/p' | grep -Po '(Short-ID:|Name:)[ ]*\K.*'
Rolf
Aaberge
paa6
Pour récupérer le nombre d'articles :
$ w3m -dump -T text/html paa6.html | sed -n '/^Articles/,/^NEP/p' | grep -o '^[[:digit:]][^.]*' | sed -n '$p'
34