You are not logged in.
Bonjour,
je suis débutant sur linux et j'ai un script bash a réaliser qui semble d'un niveau tout autre a réaliser.
Ce script doit tester si un site internet (page principal et liens internes) est valide au sens du w3c (organisme qui valide les fichiers html, php d'un site internet).
J'ai décomposé le travail a faire pour ce script:
1:récupérer les fichiers html et vérifier tous les liens dans un fichier temp
2:ces pages (html,css,php) doivent répondre aux critères de w3c
3: la sortie du script doit afficher un compte rendu des pages valides et non valides
4:dans l'affichage il faut un résumé de tout cela
5:tous les fichiers temporaires utilisés doivent etre effacés lors de l'analyse.
On a commencé un début de script pour afficher les liens d'un site ligne par ligne.
#télécharger la page
#!/bin/bash
echo "Rentrer une adresse"
nomSite="http://users.info.unicaen.fr/~jmetivie/index.php/"
wget -O temp $nomSite
grep -e "<a href=\"[^>]*" -o temp>temp2 # lit par ligne en sélectionant les caractères
#Pour enlever le a href
cut -f2 -d '"' temp2 > temp3
#création dossier liens internes du site pour index.php
rm listsite
touch listsite
cat temp3 | grep -o -s .*".php" >> listsite # lire par ligne n'importe quel fichier .php
cat temp3 | grep -o -s .*".html" >> listsite # lire par ligne n'importe quel fichier .html
cat temp3 | grep -o -s .*".htm" >> listsite # lire par ligne n'importe quel fichier .html
#afficher les liens secondaires
Offline
Salut duboi,
Dans quel cadre écrit tu ce script, lessons, exercice , boulot ?
Est-ce tu dois vérifier :
A - que les liens "marchent" ?
B - la syntaxe des fichiers html, css ?
Si c'est A t'as l'air bien parti pour y arriver
Si c'est B, ça dépend du cadre cité plus haut ( et je confirme pour le niveau ! )
- lessons : et tu dois faire ça pour quand ?
- exercice : cet un excellent exercice, tu n'y arriveras peut-être jamais mais
tu seras devenu un gourou en shell ! Si tu y arrives je t'appelerai Maître.
- boulot : là t'as un problème.*
C'est donc ça :
validateur html validator.w3.org +
validateur css jigsaw.w3.org
en un et en bash que tu veux ?
*je m'explique :
tu cas devoir écrire un analyseur de code html, et ça, même avec le language plus haut niveau ( que bash ) de ton choix, c'est déjà sacrément coton.
Tu dois donc, avant tout, lire l'intégral des spécifiactions (x)html(n) ( ça doit marcher avec les différentes variantes j'imagine ), en déduire toutes les combinaisons, imbrications de balises possibles, ....
Pareil pour le CSS
Et après implémenter tout ça en bash !
Je reviens sur c'que j'ai dit, si tu y arrives je vous appelerai Maître, mon Maître.
Bonne journée.
Offline
Hello,
Mais non, pas besoin d'écrire un validateur complet. Il suffit d'envoyer les fichiers (ou les liens) au validateur w3c (faisable avec wget) et de parser le résultat du validateur.
Pas forcément besoin de chercher les liens
Offline
Chose intéressante avec wget, on peut forcer ce dernier a faire les choses suivantes :
- prendre un fichier en argument, qu'il utilise comme liste de lien (option -i)
- le forcer a parser le fichier html pour sortir les liens (option -F)
Enjoy
PS: edit a cause des "a grave" qui ne passent pas.... -.-
Last edited by phoenix818 (02 Dec 2009 11:50:15)
Offline
phoenix818 wrote:
PS: edit a cause des "a grave" qui ne passent pas.... -.-
àààà? ÀÀÂéüè?
Test-test
1-2 1-2
...
Offline
je parie que la quote va merder (simple clic sur "quote")
Lixette wrote:
phoenix818 wrote:
PS: edit a cause des "a grave" qui ne passent pas.... -.-
Edit: bingo. bon j'ferme le quote ouvert, ça a un peu explosé la mise en page
Last edited by Tengu (02 Dec 2009 12:34:08)
Offline
-.-' faut être un peu masochiste pour vouloir faire ça en bash (si c'est un truc qui valide)....
La pour le moment j'ai ceci qui marche :
#!/bin/bash # initialisation tmp=$(mktemp) echo -n "Enter URL: " read url # check if this page is correct echo -n 'Checking first page... ' $(wget -qO - "http://validator.w3.org/check?uri=${url}&charset=%28detect+automatically%29&doctype=Inline&group=0" | grep -q 'Congratulations') if [ $? == 0 ]; then echo 'Valid' else echo 'Error(s) found' fi
Je suis en train de peiner sur la suite :
# get main page echo -n 'Getting first page... ' wget -qO $tmp $url echo 'Done' while read line; do echo $line | awk '/href/ { print gensub(/.*href="(.*[^"])" .*/, "\\3", "g") }' | grep http done < $tmp
La regex dans awk n'est pas toptop, peut-être que BOFH aura une meilleure idée ? un coup de perl -e peut-être ?
Offline
j'aurai préféré quelques lignes de code pour m'aiguiller
genre une boucle pour afficher les liens secondaires du site car le script marche que pour un lien,
c dans le cadre d'un devoir a rendre pour lundi
Offline
check le man de wget, les options "-r", "-np", "-nd", "-P", "--post-file", "-p". Ca te rendra service
edit: putain..... commence *a me gonfler ce a grave
Last edited by Tengu (03 Dec 2009 19:43:11)
Offline
ok je te remercie, pour tes scripts et tes infos
bonne soirée
Offline
j'ai essayé les wget et les différentes options que tu m'as donné par rapport au script que je t'ai montré mais pas de résultat concluant pour afficher tous les liens du site en php html et css
Offline
Tiens, moi aussi mes accents ne passent pas. (l'autre message était tronqué). Bon.
Extraire les liens des fichiers est plus compliqué qu'il n'y paraît. Par exemple, l'approche ligne-par-ligne mentionnée par Tengu ne marchera pas si il y a un retour a la ligne au milieu d'une balise. Pour ce type de travail bash ne suffit pas, il faut regarder du coté de perl, python & cie.
Si tu tiens a le faire en bash, l'approche la plus raisonnable est d'utiliser wget -r, ce qui t'évite d'avoir a coder toi-même l'analyse des liens et une queue de travail. Ensuite tu peux trouver les fichiers locaux avec find, les envoyer un par un au validateur avec wget, et collecter les résultats.
Offline
J'ai un peu la flemme de regarder en détail mais y a qques années j'avais fais des bouts de parser XML en Shell. La solution awk c'est la plus facile et tu peux travailler sur plusieurs lignes. awk c'est beaucoup plus puissant qu'à l'air de le penser Tengu, c'est même tellement haut niveau qu'on m'avait demandé de refaire avec uniquement grep, sed, et cat sans toucher à awk (la question c'était juste de ne pas devoir rajouter une commande quand des moyens plus bas niveau permettent de faire la même chose). En général un awk compliqué se traduit en 2-3 lignes de grep, sed, cat..
En principe pour faire ce genre de job faut commencer par nettoyer le fichier. Si t'as le wget original (et pas celui de busybox) tant mieux.. par contre faire des coups de sed en premier c'est le plus important. Par exemple il faut chercher les lignes tronquées qui t'intéresses et les recomposer en une seule ligne dans un nouveau fichier (très facile avec awk vu qu'il bosse en multi-lignes aussi). En même temps tu traduis les balises intéressantes comme <a..> par exemple, en un pattern que tu pourras facilement retrouver par la suite.. genre tu remplaces par __LINK__ (le but c'est aussi de rendre plus lisible le script, quand il y a des ["] avec des caractères d'échappements partout ça devient vite sale, avec des patterns on voit qqch). Faut bien découper le job étape par étape.
Tu prend une feuille et un crayon, tu réfléchis à un exemple de fichier à parser qui comprend tous les défauts possibles. Retours à la ligne au milieu d'une balise; balises non fermées.. etc..
Sur ta feuille tu écris ensuite toutes les étapes qu'il faut faire pour nettoyer le fichier et retrouver des liens propres. Et ensuite tu codes cette partie qui nettoie (ce qu'il faut nettoyer en premier, deuxième, etc,...). Et seulement quand tu as le fichier nettoyé, alors tu peux passer à la suite.
Il faut apprendre à valider les fonctionnalités une à une et ne pas réfléchir à tout en même temps. Sinon t'y arriveras jamais. Mais il faut aussi garder à l'esprit que tout est possible avec les commandes shell de bases. Après c'est une question de temps et d'expérience.
Offline
Oh, t'inquiète, je sais que awk c'est sur-puissant. par contre, un peu au-dessus du niveau de duboi, je pense. quoi qu'un peu de lecture saine ne fait jamais de mal. Perso j'ai un tres mauvais niveau "awk" , mais je me soigne.
@BOFH: ouff, chuis donc peut-être pas le seul. Sinon, mon long post tronqué (le dernier donc) mentionnait de faire un wget -r [en limitant au domaine], de limiter aux types de fichiers voulus (y a une option pour dans wget, -a sauf erreur), et de pousser les fichiers sur le validateur
Bon, checkons si y a pas de a grave dans ce post..... ce serait pas mal de trouver la cause de ce "léger" problème.
Offline