Problème de comptage boucle if

Résolu/Fermé
ellowdiiie - Modifié par jipicy le 10/06/2015 à 18:18
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 11 juin 2015 à 18:21
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 :

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

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 juin 2015 à 18:32
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 ?
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
10 juin 2015 à 23:16
Salut,

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 ^^

++
0
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 !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
11 juin 2015 à 18:21
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) :
$ 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


0