Problème de comptage boucle if
Résolu
ellowdiiie
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
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
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Comptage de pas gratuit - Télécharger - Sport
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- 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