Parser du texte avec des caractères d'échappements

utilisés pour avoir de la couleur dans son terminal.

a marqué ce sujet comme résolu.

Bonjour,

j’utilise depuis quelques temps un site très pratique pour vérifier la météo, wttr.in.

J’aimerais savoir comment il serait possible de parser les caractères d’échappement (et les codes) utilisés dans la sortie (tentez un curl sur ce site) afin de l’afficher dans un conky avec les couleurs.

Avez-vous des idées ?

PS : un exemple, tel qu’affiché dans Vim.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Prévisions météo pour: Rennes, France                                                
                                                                                    
 ^[[38;5;250m     .-.     ^[[0m Léger grésil                                        
 ^[[38;5;250m    (   ).   ^[[0m ^[[38;5;048m4^[[0m-^[[38;5;047m6^[[0m °C^[[0m        
 ^[[38;5;250m   (___(__)  ^[[0m ^[[1m→^[[0m ^[[38;5;154m9^[[0m km/h^[[0m            
 ^[[38;5;111m    ‘ ^[[38;5;255m*^[[38;5;111m ‘ ^[[38;5;255m*  ^[[0m 10 km^[[0m       
 ^[[38;5;255m   *^[[38;5;111m ‘ ^[[38;5;255m*^[[38;5;111m ‘   ^[[0m 0.4 mm^[[0m      
                                                       ┌─────────────┐               
┌──────────────────────────────┬───────────────────────┤mer. 26 avril├───────────────────────┬──────────────────────────────┐
│             Matin            │          Après-midi   └──────┬──────┘       Soir            │             Nuit             │   
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ ^[[38;5;226m    \   /    ^[[0m Ensoleillé     │ ^[[38;5;250m     .-.     ^[[0m Pluie légère é…│ ^[[38;5;226m _`/""^[[38;5;250m.-.    ^[[0m Averse de plui…│ ^[[38;5;226m _`/""^[[38;5;250m.-.    ^[[0m Pluie éparse à │ 
│ ^[[38;5;226m     .-.     ^[[0m ^[[38;5;049m3^[[0m-^[[38;5;048m4^[[0m °C^[[0m         │ ^[[38;5;250m    (   ).   ^[[0m ^[[38;5;046m8^[[0m °C^[[0m           │ ^[[38;5;226m  ,\_^[[38;5;250m(   ).  ^[[0m ^[[38;5;082m10^[[0m °C^[[0m          │ ^[[38;5;226m  ,\_^[[38;5;250m(   ).  ^[[0m ^[[38;5;047m6^[[0m-^[[38;5;047m7^[[0m °C^[[0m         │
│ ^[[38;5;226m  ― (   ) ―  ^[[0m ^[[1m↓^[[0m ^[[38;5;190m10^[[0m-^[[38;5;220m19^[[0m km/h^[[0m   │ ^[[38;5;250m   (___(__)  ^[[0m ^[[1m↓^[[0m ^[[38;5;226m15^[[0m-^[[38;5;214m23^[[0m km/h^[[0m   │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m ^[[1m↓^[[0m ^[[38;5;220m18^[[0m-^[[38;5;208m27^[[0m km/h^[[0m   │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m ^[[1m↗^[[0m ^[[38;5;226m14^[[0m-^[[38;5;208m24^[[0m km/h^[[0m   │  
│ ^[[38;5;226m     `-’     ^[[0m 17 km^[[0m          │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 15 km^[[0m          │ ^[[38;5;111m     ‘ ‘ ‘ ‘ ^[[0m 14 km^[[0m          │ ^[[38;5;111m     ‘ ‘ ‘ ‘ ^[[0m 16 km^[[0m          │
│ ^[[38;5;226m    /   \    ^[[0m 0.7 mm | 67%^[[0m   │ ^[[38;5;111m   ‘ ‘ ‘ ‘   ^[[0m 0.5 mm | 98%^[[0m   │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 0.3 mm | 85%^[[0m   │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 0.1 mm | 33%^[[0m   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤jeu. 27 avril├───────────────────────┬──────────────────────────────┐
│             Matin            │          Après-midi   └──────┬──────┘       Soir            │             Nuit             │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ 
│ ^[[38;5;226m    \   /    ^[[0m Ensoleillé     │ ^[[38;5;226m   \  /^[[0m       Partiellement …│ ^[[38;5;226m _`/""^[[38;5;250m.-.    ^[[0m Pluie éparse à │ ^[[38;5;226m   \  /^[[0m       Partiellement …│ 
│ ^[[38;5;226m     .-.     ^[[0m ^[[38;5;048m5^[[0m-^[[38;5;047m6^[[0m °C^[[0m         │ ^[[38;5;226m _ /""^[[38;5;250m.-.    ^[[0m ^[[38;5;082m10^[[0m °C^[[0m          │ ^[[38;5;226m  ,\_^[[38;5;250m(   ).  ^[[0m ^[[38;5;082m11^[[0m-^[[38;5;082m12^[[0m °C^[[0m       │ ^[[38;5;226m _ /""^[[38;5;250m.-.    ^[[0m ^[[38;5;047m7^[[0m-^[[38;5;046m8^[[0m °C^[[0m         │ 
│ ^[[38;5;226m  ― (   ) ―  ^[[0m ^[[1m↓^[[0m ^[[38;5;154m9^[[0m-^[[38;5;220m19^[[0m km/h^[[0m    │ ^[[38;5;226m   \_^[[38;5;250m(   ).  ^[[0m ^[[1m↗^[[0m ^[[38;5;190m12^[[0m-^[[38;5;214m20^[[0m km/h^[[0m   │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m ^[[1m↘^[[0m ^[[38;5;220m18^[[0m-^[[38;5;208m26^[[0m km/h^[[0m   │ ^[[38;5;226m   \_^[[38;5;250m(   ).  ^[[0m ^[[1m↘^[[0m ^[[38;5;226m13^[[0m-^[[38;5;214m22^[[0m km/h^[[0m   │
│ ^[[38;5;226m     `-’     ^[[0m 19 km^[[0m          │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m 18 km^[[0m          │ ^[[38;5;111m     ‘ ‘ ‘ ‘ ^[[0m 16 km^[[0m          │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m 17 km^[[0m          │
│ ^[[38;5;226m    /   \    ^[[0m 0.0 mm | 0%^[[0m    │               0.1 mm | 39%^[[0m   │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 0.1 mm | 19%^[[0m   │               0.0 mm | 0%^[[0m    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ 
                                                       ┌─────────────┐                                                        
┌──────────────────────────────┬───────────────────────┤ven. 28 avril├───────────────────────┬──────────────────────────────┐
│             Matin            │          Après-midi   └──────┬──────┘       Soir            │             Nuit             │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│               Nuageux        │ ^[[38;5;226m _`/""^[[38;5;250m.-.    ^[[0m Averse de plui…│ ^[[38;5;240;1m     .-.     ^[[0m Pluie modérée  │ ^[[38;5;226m _`/""^[[38;5;250m.-.    ^[[0m Pluie éparse à │
│ ^[[38;5;250m     .--.    ^[[0m ^[[38;5;047m7^[[0m °C^[[0m           │ ^[[38;5;226m  ,\_^[[38;5;250m(   ).  ^[[0m ^[[38;5;082m11^[[0m-^[[38;5;082m12^[[0m °C^[[0m       │ ^[[38;5;240;1m    (   ).   ^[[0m ^[[38;5;118m14^[[0m °C^[[0m          │ ^[[38;5;226m  ,\_^[[38;5;250m(   ).  ^[[0m ^[[38;5;082m11^[[0m-^[[38;5;082m12^[[0m °C^[[0m       │
│ ^[[38;5;250m  .-(    ).  ^[[0m ^[[1m↘^[[0m ^[[38;5;154m7^[[0m-^[[38;5;220m17^[[0m km/h^[[0m    │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m ^[[1m↘^[[0m ^[[38;5;154m7^[[0m-^[[38;5;226m15^[[0m km/h^[[0m    │ ^[[38;5;240;1m   (___(__)  ^[[0m ^[[1m←^[[0m ^[[38;5;190m12^[[0m-^[[38;5;220m16^[[0m km/h^[[0m   │ ^[[38;5;226m   /^[[38;5;250m(___(__) ^[[0m ^[[1m↓^[[0m ^[[38;5;190m10^[[0m-^[[38;5;220m17^[[0m km/h^[[0m   │
│ ^[[38;5;250m (___.__)__) ^[[0m 18 km^[[0m          │ ^[[38;5;111m     ‘ ‘ ‘ ‘ ^[[0m 16 km^[[0m          │ ^[[38;5;21;1m  ‚‘‚‘‚‘‚‘   ^[[0m 15 km^[[0m          │ ^[[38;5;111m     ‘ ‘ ‘ ‘ ^[[0m 17 km^[[0m          │
│               0.1 mm | 50%^[[0m   │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 0.2 mm | 83%^[[0m   │ ^[[38;5;21;1m  ‚’‚’‚’‚’   ^[[0m 1.2 mm | 80%^[[0m   │ ^[[38;5;111m    ‘ ‘ ‘ ‘  ^[[0m 0.1 mm | 33%^[[0m   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                                                 
New feature: multilingual location names ^[[92mwttr.in/станция+Восток^[[0m (in UTF-8) and location search ^[[92mwttr.in/~Kilimanjaro^[[0m (just add ~ before)
Follow ^[[46m^[[30m@igor_chubin^[[0m for wttr.in updates ‘ ‘ ‘   0.2 mm | 83%   │   ‚’‚’‚’‚’    
+0 -0

Ces affichages sont faits pour être affichés dans un terminal, directement.

Plutôt que t’embêter à le parser manuellement, je te conseille plutôt de chercher une API météo dédiée, par exemple sur ce site.

Cette API a l’air d’être correcte, bien que je ne l’ai pas testée.

Ce que tu peux faire, c’est un script python qui récupère régulièrement les dernières informations (par exemple 1 requête toutes les 10 minutes, pour de la météo, ça ne devrait pas trop changer :P ), et stocke chaque information dont tu as besoin dans des fichiers séparés, ne contenant que l’information, soit 1 info par fichier.

Ensuite, dans ton .conkyrc, tu pourra simplement faire ${exec cat /home/moi/.meteo/temp} pour avoir la température, par exemple.

L’automatisation de la récupération peut se faire avec une règle cronjob, pour ça, je te laisse te documenter vu que ce sera assez facile, le travail effectué étant très basique (le travail de cron, pas de python ; soit invoquer un script toutes les 10 minutes).

Je plussoie Artemix, surtout si tu comptes afficher ces données un peu différemment.

Toutefois, si tu tiens à utiliser wttr.in pour ne pas avoir à gérer le rendu en ASCII, ou si le rendu par défaut te convient, il serait sûrement plus simple d’utiliser directement le HTML de la page. Ensuite, tu pourrais parser les balises span pour récupérer leur couleur (renseignée dans la balise style en haut de la page) et les transformer en balises {color} appropriées pour conky.

Voilà ce que j’ai chez moi, ça me semble bien plus simple à parser, étant donné qu’on trouve facilement des parseurs de HTML dans la plupart des langages.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<style type="text/css">
.ef0,.f0 { color: #073642; } .eb0,.b0 { background-color: #073642; }
.ef1,.f1 { color: #D30102; } .eb1,.b1 { background-color: #D30102; }
.ef2,.f2 { color: #859900; } .eb2,.b2 { background-color: #859900; }
.ef3,.f3 { color: #B58900; } .eb3,.b3 { background-color: #B58900; }
.ef4,.f4 { color: #268BD2; } .eb4,.b4 { background-color: #268BD2; }
.ef5,.f5 { color: #D33682; } .eb5,.b5 { background-color: #D33682; }
.ef6,.f6 { color: #2AA198; } .eb6,.b6 { background-color: #2AA198; }
.ef7,.f7 { color: #EEE8D5; } .eb7,.b7 { background-color: #EEE8D5; }
.ef8, .f0 > .bold,.bold > .f0 { color: #002B36; font-weight: normal; }
.ef9, .f1 > .bold,.bold > .f1 { color: #CB4B16; font-weight: normal; }
.ef10,.f2 > .bold,.bold > .f2 { color: #586E75; font-weight: normal; }
.ef11,.f3 > .bold,.bold > .f3 { color: #657B83; font-weight: normal; }
.ef12,.f4 > .bold,.bold > .f4 { color: #839496; font-weight: normal; }
.ef13,.f5 > .bold,.bold > .f5 { color: #6C71C4; font-weight: normal; }
.ef14,.f6 > .bold,.bold > .f6 { color: #93A1A1; font-weight: normal; }
.ef15,.f7 > .bold,.bold > .f7 { color: #FDF6E3; font-weight: normal; }
.eb8  { background-color: #002B36; }
.eb9  { background-color: #CB4B16; }
.eb10 { background-color: #586E75; }
.eb11 { background-color: #657B83; }
.eb12 { background-color: #839496; }
.eb13 { background-color: #6C71C4; }
.eb14 { background-color: #93A1A1; }
.eb15 { background-color: #FDF6E3; }
.ef16 { color: #000000; } .eb16 { background-color: #000000; }
.ef17 { color: #00005f; } .eb17 { background-color: #00005f; }
.ef18 { color: #000087; } .eb18 { background-color: #000087; }
<!-- Etc... -->
</style>
</head>

<body class="">
<pre>
Weather report: Tours, France

 <span class="f8"><span class="blink"><span class="bold">     .-.     </span></span></span> Rain Shower
 <span class="f8"><span class="blink"><span class="bold">    (   ).   </span></span></span> <span class="ef047">6</span>-<span class="ef046">8</span> °C         
 <span class="f8"><span class="blink"><span class="bold">   (___(__)  </span></span></span> <span class="bold"></span> <span class="ef190">11</span> km/h      
 <span class="f8"><span class="blink"><span class="bold">  ‚‘‚‘‚‘‚‘   </span></span></span> 10 km          
 <span class="f8"><span class="blink"><span class="bold">  ‚’‚’‚’‚’   </span></span></span> 1.2 mm         
                                                       ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  Wed 26 Apr ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ <span class="ef226">    \   /    </span> Sunny          │ <span class="ef226">    \   /    </span> Sunny          │ <span class="ef226"> _`/&quot;&quot;<span class="ef250">.-.    </span></span> Light rain sho…│ <span class="ef226"> _`/&quot;&quot;<span class="ef250">.-.    </span></span> Patchy rain po…│
│ <span class="ef226">     .-.     </span> <span class="ef049">3</span>-<span class="ef048">4</span> °C         │ <span class="ef226">     .-.     </span> <span class="ef046">9</span> °C           │ <span class="ef226">  ,\_<span class="ef250">(   ).  </span></span> <span class="ef082">11</span> °C          │ <span class="ef226">  ,\_<span class="ef250">(   ).  </span></span> <span class="ef047">6</span>-<span class="ef047">7</span> °C         │
│ <span class="ef226">  ― (   ) ―  </span> <span class="bold"></span> <span class="ef154">9</span>-<span class="ef220">19</span> km/h    │ <span class="ef226">  ― (   ) ―  </span> <span class="bold"></span> <span class="ef190">11</span>-<span class="ef220">17</span> km/h   │ <span class="ef226">   /<span class="ef250">(___(__) </span></span> <span class="bold"></span> <span class="ef226">13</span>-<span class="ef214">21</span> km/h   │ <span class="ef226">   /<span class="ef250">(___(__) </span></span> <span class="bold"></span> <span class="ef226">13</span>-<span class="ef214">22</span> km/h   │
│ <span class="ef226">     `-’     </span> 18 km          │ <span class="ef226">     `-’     </span> 17 km          │ <span class="ef111">     ‘ ‘ ‘ ‘ </span> 14 km          │ <span class="ef111">     ‘ ‘ ‘ ‘ </span> 15 km          │
│ <span class="ef226">    /   \    </span> 0.0 mm | 0%    │ <span class="ef226">    /   \    </span> 0.3 mm | 58%   │ <span class="ef111">    ‘ ‘ ‘ ‘  </span> 1.2 mm | 86%   │ <span class="ef111">    ‘ ‘ ‘ ‘  </span> 0.7 mm | 97%   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
+0 -0

rezemika : effectivement, le HTML me paraît plus simple, mais… comme tu le récupère le HTML, au fait ? :D

En changeant de user-agent, évidemment. Bon, du coup je vais faire ça.

Par contre, comment faire en sorte que conky accepte les balises sorties par un script ? Je ne trouve rien à ce sujet…

+0 -0

rezemika : effectivement, le HTML me paraît plus simple, mais… comme tu le récupère le HTML, au fait ? :D

En changeant de user-agent, évidemment. Bon, du coup je vais faire ça.

Par contre, comment faire en sorte que conky accepte les balises sorties par un script ? Je ne trouve rien à ce sujet…

Breizh

Ah en effet, je n’y avais pas pensé. Je suis tombé là-dessus, ça m’a l’air de correspondre à ton besoin : https://superuser.com/questions/366036/how-to-change-color-of-conky-text-via-file-script. ;)

Pour récupérer le code HTML, wget a l’air de pouvoir le faire simplement, si tu veux rester en BASH. Est-ce que ça marche de ton côté ?

Sinon, pour le parsing, je ne suis pas sur que BASH soit le plus approprié. Quelque chose avec BeautifulSoup4 en Python3, par exemple, serait sûrement plus simple à mettre en œuvre. Après, tu pourrais faire un sed sur chaque balise span pour la remplacer par la balise conky de la couleur correspondante.

+0 -0

Nan mais comme je l’ai dit, même curl le permet. Suffit de mettre, par exemple, Mozilla en user-agent, et pouf, on a du HTML. Je comptais faire le script en Python. Un script qui récupère le HTML, le parse et ressors le rendu sur la sortie standard. Un execi dans Conky, et voilà.

En effet, execp[i] fait ce que je cherchais. Je connais pas encore le man de Conky par cœur apparemment :D .

+0 -0

J’aimerais savoir comment il serait possible de parser les caractères d’échappement

Breizh

Ça sert à rien de les parser. Suffit de consulter la doc de wttr.in pour voir que si tu passes ?T il te retourne pas les séquences.

Tu peux curl wttr.in/:help si tu veux le reste de la doc.

+1 -0

@tleb : je suppose que tu ne seras pas surpris si je te dis que je l’utilise au moins depuis des semaines si ce n’est des mois :D

@victor : je me doutais qu’il y avais une doc, mais je savais pas où. Merci :) .
Par ailleurs, j’aimerais conserver les couleurs. Juste les faire s’afficher dans Conky.

+0 -0

Je ne doute pas que ça marche très bien. :)

C’est néanmoins améliorable à peu de frais.

curl "http://fr.wttr.in/Ville_0.png" > /tmp/weather.png

vs

curl http://fr.wttr.in/Ville_0.png -o /tmp/weather.png

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte