Extraire un tableau d'un code source

Fermé
Franky13000 Messages postés 3 Date d'inscription mercredi 17 août 2022 Statut Membre Dernière intervention 18 août 2022 - 17 août 2022 à 14:06
Franky13000 Messages postés 3 Date d'inscription mercredi 17 août 2022 Statut Membre Dernière intervention 18 août 2022 - 18 août 2022 à 11:44

Bonjour,

Dans la partie du code source d'une page ci dessous, je cherche à récupérer les tableaux correspondants à "Pluie sur 24h", "Temp\351rature maximale", "Temp\351rature minimale". 

Je débute sur python, je ne sais pas comment m'y prendre pour identifier le tableau et le sauvegarder.

Comme il n'y a pas de balise, je ne peux pas utiliser BeautifulSoup, je pense.

Je suis bloqué, merci pour votre aide :)

tooltip: {
backgroundColor: 'rgba(255, 255, 255, .70)',
borderWidth: 1,
shared:true,
crosshairs:true,
headerFormat: '<span style="font-size:10px">{point.key} juillet 2022</span><br/>'
},
plotOptions: {
column: {
groupPadding: 0.0,
pointPadding: 0.075
}
},
series: [
{
type: 'column',
name: 'Pluie sur 24h',
yAxis:1,
data: [[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0]],
color: '#89A54E',
borderWidth:0,
tooltip:{valueSuffix:'mm'}
},{
type: 'line',
name: 'Temp\351rature maximale',
data: [[1,29.5],[2,33.5],[3,34.1],[4,36.3],[5,35.2],[6,33.9],[7,33.6],[8,32.8],[9,33.9],[10,32.4],[11,30.2],[12,30.9],[13,31.5],[14,33.4],[15,39.1],[16,34.6],[17,32.8],[18,35.6],[19,35.4],[20,34.9],[21,36.9],[22,34.3],[23,33.1],[24,36.2],[25,33.5],[26,33.9],[27,33.7],[28,34.2],[29,31.3],[30,35.1],[31,36.5]],
color: '#AA4643',
tooltip:{valueSuffix:'\260C'}
},
{
type: 'line',
name: 'Temp\351rature minimale',
data: [[1,18.8],[2,15],[3,18.7],[4,22.2],[5,23.4],[6,22.8],[7,20.8],[8,21.6],[9,20.1],[10,19.8],[11,19.7],[12,20.2],[13,20],[14,20.6],[15,21.6],[16,19.8],[17,20.1],[18,24.1],[19,23],[20,23.3],[21,24.2],[22,22.1],[23,24.1],[24,22.2],[25,22.1],[26,25.3],[27,22.6],[28,18.8],[29,21.5],[30,23],[31,19.1]],
color: '#4572A7',
tooltip:{valueSuffix:'\260C'}
},


Windows / Chrome 104.0.0.0

A voir également:

3 réponses

Salut,

ce que vous présentez est du JSON, un format de stockage de données en texte.

Il n'y a pas de balise parce que la structure d'un document JSON n'en contient pas. Entre accolades vous avez les attributs de l'objet et après chaque attribut le signe " : "  qui indique la valeur puis une virgule pour la valeur suivante.

Cette notation en plus d'être simple permet de conserver une structure objet.

objetJSON:{
 valeur1:'bla',
 valeur2:10,
 valeur3:[10,'blabla', [3,2,1,'boom'] ],
 objetDansLObjet:{ valeurA:'a' , valeurB: 11  }
}

JSON comme XML et CSV n'est qu'une structure de données en fichier texte. Donc pas exploitable si on lui dit pas les règles de séparations utilisées le programme ne voit que du texte et pas les données.

Il faut donc parser le fichier pour l'utiliser dans Python.

https://waytolearnx.com/2020/06/lire-ecrire-parse-le-json-avec-python.html

0
Franky13000 Messages postés 3 Date d'inscription mercredi 17 août 2022 Statut Membre Dernière intervention 18 août 2022
17 août 2022 à 18:14

Super merci ! J'ai réussi à parser la liste.

Cependant les listes à extraire (ligne 5098) sont noyées dans les 5881 ligne du code source de la page view-source:https://www.infoclimat.fr/climatologie-mensuelle/07650/juillet/2022/marseille-marignane-marseille-provence.html

Comment repérer, sélectionner automatiquement les bons objets json à parser et convertir en dictionnaire python ?

0

Bonjour, pas vraiment facile de récupérer les valeurs que tu souhaites, à part à coups d'expressions régulières, il n'y pas de solutions, json on l'oublie, trop strict.

import re
import ast
import urllib.request

str_to_find = (
    'Pluie sur 24h',
    'Température maximale',
    'Température minimale',
)
data = []

url = 'METTRE URL ICI'

with urllib.request.urlopen(url) as f:
    content = f.read().decode()
    for m in re.finditer('(?<=\{)(.+?)}', content, flags=re.S):
        for s in str_to_find:
            if s in m[1]:
                # value = re.sub('\s{2,}', '', m[0])
                value = re.sub('([\w ]+)(?=:)', '"\g<1>"', m[0])
                value = '{' + value + '}'
                data.append(ast.literal_eval(value))
print(data)

Pour ne pas trop se prendre la tête, un coup d'eval sur la chaîne et hop le tour est joué, ne pas utiliser eval sur des données inconnues, ast.litteral_eval permet justement de faire cela de façon plus "sûre".

Note que si tu as besoin de faire d'autres tests, évite de spammer la page d'infoclimat, enregistre la page html en local et fais tes tests dessus, avec open et plus urlib.request.

Mais peut-être que sur ce site, il y a possibilité d'avoir des données brutes ? Je n'ai pas trop cherché.

0
Franky13000 Messages postés 3 Date d'inscription mercredi 17 août 2022 Statut Membre Dernière intervention 18 août 2022
18 août 2022 à 11:44

Merci beaucoup ! C'est super !

Je vais digérer ton code et faire les tests que tu dis. Encore merci beaucoup :)

0