Extraction sous-chaines page web

Résolu/Fermé
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 - Modifié par p_tony le 15/02/2014 à 04:37
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 - 17 févr. 2014 à 17:58
Bonjour,

Je cherche le moyen de récupéré 4 informations dans une page web que je récupère déjà en local
Il s'agit de la page d'info de mon imprimante, dont je veux extraire le status des cartouches d'encres, le status de l'imprimante et le nombre total de pages imprimées.

Pour les status, je sais que je peux le déterminer à partir des icones de status affichés dans la page (icon_status_normal.gif = normal, icon_status_warning.gif = warning, etc...)

cat $PAGE_PATH | grep "/icon_status_"
me permet déja de filtrer un peu pour obtenir:

var blackInkStatusImage="./gif/icon_status_normal.gif";
var colorInkStatusImage="./gif/icon_status_normal.gif";
         <img src="http://192.168.0.11/gif/icon_status_normal.gif" border="0" align="absmiddle" alt="Ready" title="Ready"/> 
                        <img src="http://192.168.0.11/gif/icon_status_normal.gif" border="0" align="absmiddle" alt="Ready" title="Ready" /> 


mais enfaite je suis un peu perdu entre sed, awk, ou grep.

Ce que je voudrais au final, c'est des variables black_ink_status, color_ink_status, printer_status, total_pages

edit:
Bon, je tatonne lentement:
cat $PAGE_PATH | sed -nr 's#.+/icon_status_([a-z]+).*#\1#p'
me renvoie
normal
normal
normal
normal





Voici un extrait épuré (c'est plus digeste) du html de la page


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  <!-- document type -->
<head>
   <!-- Backend page info intialization -->
   <title>
      HP Officejet J6400 series
   192.168.0.11
   </title>
   <script language="JavaScript" type="text/javascript">
      <!-- add in specific javascript functions here
      var blackink=70;
      var blackInkStatusImage="./gif/icon_status_normal.gif";
      var colorink=70;
      var colorInkStatusImage="./gif/icon_status_normal.gif";
      -->
   </script>
<!-- specific html head page -->
</head>
<body>

<!-- ####################################################
####################################################-->

<!-- user information -->
<table cellpadding="0" cellspacing="0" border="0" width="100%" summary="This table is used to display the device network information.">
   <tr>
      <td class="status">
         Status: 
         <img src="http://192.168.0.11/gif/icon_status_normal.gif" border="0" align="absmiddle" alt="Ready" title="Ready"/> 
         Ready    
      </td>
   </tr>
</table>

<!-- ####################################################
####################################################-->

            <div class="statusPane">
               <h5>
                   Device:
               </h5>
               <table cellpadding="0" cellspacing="0" class="dataTable" id="tableDeviceDetails" width="100%">
                  <tr>
                     <td class="info">
                        Total Page Count
                     </td>
                     <td>
                        313
                     </td>
                  </tr>
               </table>
            </div>
A voir également:

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
15 févr. 2014 à 08:42
Salut,

Et tu voudrais que ça te renvoie quoi exactement ?

0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
Modifié par p_tony le 15/02/2014 à 18:00
Bonjour,

Je vais préciser, mais du coup j'ai un doute sur le sens de ta question.

Pour les status, je sais que je peux le déterminer à partir des icones de status affichés dans la page:
- icon_status_normal.gif = normal,
- icon_status_warning.gif = warning,


cela veut dire qu'à certains endroits j'ai des chaines
 /gif/icon_status_normal.gif 
desquelles je veux extraire la sous-chaine entre
 /gif/icon_status_ 
et
.gif 
... soit ici
normal 
.


Sinon pour le nombre total de pages, c'est ici le nombre (313) dans le tableau:

               <table cellpadding="0" cellspacing="0" class="dataTable" id="tableDeviceDetails" width="100%">
                  <tr>
                     <td class="info">
                        Total Page Count
                     </td>
                     <td>
                        313
                     </td>
                  </tr>
               </table>
<code>
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 févr. 2014 à 18:27
N'ayant pas le contenu de la page en entier, les solutions ci-après sont sous réserves ;-\

Pour le normal (en parsant le code source de la page) :
$ grep -Po 'var .*[Ss]tatus_\K[^.]*' brol 
normal
normal

Pour le status et le nombre de page (en parsant la sortie formatée avec un navigateur en mode terminal) :
$ links -dump brol | grep -Po '(Status:|Page Count) *\K[^ ]*'
Ready
313
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
15 févr. 2014 à 18:42
Merci pour ta proposition, mais enfaite j'ai oublié de préciser que mon systeme est un nas synology et que les utilitaires sont ceux de busybox 1.16.

Ca signifie que certaines options ne sont pas présentent.

Ici pas de grep avec l'option -P malheureusement:

nas> cat $PAGE_PATH | grep -Po 'var .*[Ss]tatus_\K[^.]*' brol
grep: invalid option -- P
BusyBox v1.16.1 (2013-11-09 00:52:17 CST) multi-call binary.

Usage: grep [-HhnlLoqvsriFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...

Search for PATTERN in FILEs (or stdin)

Options:
        -H      Add 'filename:' prefix
        -h      Do not add 'filename:' prefix
        -n      Add 'line_no:' prefix
        -l      Show only names of files that match
        -L      Show only names of files that don't match
        -c      Show only count of matching lines
        -o      Show only the matching part of line
        -q      Quiet. Return 0 if PATTERN is found, 1 otherwise
        -v      Select non-matching lines
        -s      Suppress open and read errors
        -r      Recurse
        -i      Ignore case
        -F      PATTERN is a literal (not regexp)
        -E      PATTERN is an extended regexp
        -m N    Match up to N times per file
        -A N    Print N lines of trailing context
        -B N    Print N lines of leading context
        -C N    Same as '-A N -B N'
        -e PTRN Pattern to match
        -f FILE Read pattern from file


et je n'ai pas links non-plus du coup :/ .

une alternative peut-être ? :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 févr. 2014 à 18:53
mon systeme est un nas synology et que les utilitaires sont ceux de busybox 1.16
Effectivement, ça va limiter grave ;-((

Va falloir parser avec du
sed
ou du
awk
et oublier links et consort ;-\
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 févr. 2014 à 11:18
hello
comme ça ?
$ awk -F "[ =/]*" '/var.*status/ {split($6, a, "[_.]"); print $3, a[3]}' fichier.html
blackInkStatusImage normal
colorInkStatusImage normal
$
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
15 févr. 2014 à 18:06
Hmmm, ça me renvoie ça :/

awk -F "[ =/]*" '/var.*status/ {split($6, a, "[_.]"); print $3, a[3]}' /var/services/web/cronPrinterPage.html
a
a
.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
16 févr. 2014 à 09:49
montre le fichier html
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 16/02/2014 à 14:00
essayer ça
$ awk  '/var.*status/ {split($2, a, "[=/._]"); print  a[1], a[7]}'  fichier.html
blackInkStatusImage normal
colorInkStatusImage normal
avec page count
$ awk  '/var.*status/ {split($2, a, "[=/._]"); print  a[1], a[7]} /Total/ {getline; getline; getline; print $1}' fichier.html
blackInkStatusImage normal
colorInkStatusImage normal
313
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
17 févr. 2014 à 02:06
Voici la source html , dont j'ai enlever quelques infos et les lignes vides: https://pastebin.com/ue0yENcN
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 févr. 2014 à 11:14
résultat.
$ awk  '/var.*status/ {split($2, a, "[=/._]"); print  a[1], a[7]}'  fichier.htm
blackInkStatusImage normal
colorInkStatusImage normal
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
Modifié par p_tony le 15/02/2014 à 18:29
Bon j'ai trouvé ça pour les satus des cartouches et de l'imprimante:
BLACK_INK_STATUS=$(cat $PAGE_PATH | sed -nre 's#.+/icon_status_([a-z]+).*#\1#p' | sed -n '1p' )
COLOR_INK_STATUS=$(cat $PAGE_PATH | sed -nre 's#.+/icon_status_([a-z]+).*#\1#p' | sed -n '2p' )
PRINTER_STATUS=$(cat $PAGE_PATH | sed -nre 's#.+/icon_status_([a-z]+).*#\1#p' | sed -n '3p' )
echo $BLACK_INK_STATUS; echo $COLOR_INK_STATUS; echo $PRINTER_STATUS

normal 
normal 
normal 


Question subsidiaire:

Pourquoi, je ne peux pas modifier mon message original pour y ajouter de nouvelles infos ?
:/
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 févr. 2014 à 18:13
Salut,

Parce qu'il y a un délai pour l'édition, et ça se comprend, par exemple, vu que j'ai déjà vu ton 1er message, il est rare que j'y retourne voir une quelconque modif (sauf cas exceptionnel), donc mieux vaut rajouter une réponse, au moins on est averti et c'est mieux ainsi ;-))
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
15 févr. 2014 à 18:54
Oui c'est pas faux.
Enfaite c'est une habitudes à cause des autres forums, ou justement les gens trouvent plus commode d'avoir un suivie dans le premier post plutôt que de lire 50 messages
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 févr. 2014 à 12:05
Re-

Tiens par rapport à tes tests, essaies ça :

$ sed -rn 's#.*icon_status_([^.]*).*#\1#p;/Page Count/{n;n;n;s/ *//p}' plop 
normal
normal
normal
313
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
17 févr. 2014 à 01:37
Nickel, c'est ce que je cherché :)

Je vais l'utilisais comme ça:
BLACK_INK_STATUS=$(cat $PAGE_PATH | sed -rn 's#.+/icon_status_([^.]+).*#\1#p' | sed -n '1p' )
COLOR_INK_STATUS=$(cat $PAGE_PATH | sed -rn 's#.+/icon_status_([^.]+).*#\1#p' | sed -n '2p' )
PRINTER_STATUS=$(cat $PAGE_PATH | sed -rn 's#.+/icon_status_([^.]+).*#\1#p' | sed -n '3p' )
TOTAL_PRINTED_PAGES=$( cat $PAGE_PATH | sed -rn '/Page Count/{n;n;n;s/ *//p}'


Je ne pense qu'il doit y'avoir mieux plus selectionne la 2ere 2eme ou 3eme ocuurence, mais en attendant ça fait le boulot :).

Merci pour votre aide.
0
p_tony Messages postés 69 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 18 mars 2015 11
17 févr. 2014 à 17:58
Ce coup de fatigue que j'ai eu ^^'
Je pense qu'il doit y avoir mieux pour sélectionner la 1ere 2eme ou 3eme occurrence, mais en attendant ça fait le boulot :). 

Et sinon au final je pars sur
BLACK_INK_STATUS=$(sed -rn 's#/icon_status_([^.]+).*#\1#p' $PAGE_PATH | sed -n '1p')
COLOR_INK_STATUS=$(sed -rn 's#/icon_status_([^.]+).*#\1#p' $PAGE_PATH | sed -n '2p')
PRINTER_STATUS=$(  sed -rn 's#/icon_status_([^.]+).*#\1#p' $PAGE_PATH | sed -n '3p')
TOTAL_PRINTED_PAGES=$(sed -rn '/Page Count/{n;n;n;s/ *//p}' $PAGE_PATH)


Le
cat  $PAGE_PATH
n'est peut-être pas utile enfaite :)
0