Bonjour,
Ça ne fonctionne pas avec le « xpath complet ». Il suffit d’une pub en plus ou en moins, une refonte du site et tout est décalé.
Avec ce xpath copié depuis Google Chrome, ça fonctionne actuellement:
[2024-02-22 16:21:11][SCENARIO] Résultat de la commande Rafales : 51.5
Au lieu de prendre tout le document avec les pubs, seule cette partie est utilisée:
PS: Dans le post que vous citez au début, pour la même demande (vitesse des rafales), la solution était différente:
Oui, les colonnes changent dans le temps, voire parfois en dynamique.
Comme j’en avais marre de bidouiller les numéros de colonne, j’ai changé le code pour rechercher les intitulés qui sont plus constants. Voici ce que ça donne :
// On récupère les tags du scénario
$tags = $scenario->getTags();
// On extrait l'éventuel tag maj
$maj = $tags['#maj#'];
// Pluie annuelle
$url = "https://www.infoclimat.fr/climatologie/annee/".date("Y")."/xxx.html";
$data = file_get_contents($url);
@$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($data);
libxml_use_internal_errors(false);
$xpath = new DomXPath($dom);
for ($k = 12; $k <= 16; $k++) {
$node = $xpath->query("//*[@id=\"tableau-releves\"]/tr[".$k."]/td[1]/b");
$texte = $node[0]->nodeValue;
//$scenario->setLog("Libellé : $texte");
if (stripos($texte, 'Cumul') !== FALSE) {
$scenario->setLog("Match trouvé pour \"Cumul`\"");
$node = $xpath->query("//*[@id=\"tableau-releves\"]/tr[".$k."]/td[14]/span");
$precipitations = $node[0]->nodeValue;
$scenario->setLog("Précipitations annuelles : $precipitations");
if ($precipitations != "") {
cmd::byString("#[Météo][Infoclimat][Pluie année]#")->event($precipitations);
}
}
}
// Relevés du jour
$url = "https://www.infoclimat.fr/observations-meteo/temps-reel/xxx.html";
$data = file_get_contents($url);
@$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($data);
libxml_use_internal_errors(false);
$xpath = new DomXPath($dom);
for ($c = 2; $c <= 10; $c++) {
$node = $xpath->query("//*[@id=\"resptable-releves\"]/thead/tr/th[".$c."]/a");
$titre_colonne = $node[0]->nodeValue;
//$scenario->setLog("Colonne : $titre_colonne");
if (stripos($titre_colonne, 'rature') !== FALSE) { $c_temperature = $c-1; } // Température
if (stripos($titre_colonne, 'Pluie') !== FALSE) { $c_pluie = $c-1; }
if (stripos($titre_colonne, 'Vent') !== FALSE) { $c_vent = $c-1; }
if (stripos($titre_colonne, 'Hum') !== FALSE) { $c_humidite = $c-1; }
if (stripos($titre_colonne, 'Pt.') !== FALSE) { $c_rosee = $c-c; }
if (stripos($titre_colonne, 'Pression') !== FALSE) { $c_pression = $c-1; }
}
//Heure
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/th/span");
$nouvelle_heure = preg_replace ('#h$#','h00',$node[0]->nodeValue);
$cmd = cmd::byString("#[Météo][Infoclimat][Heure]#");
$ancienne_heure = $cmd->execCmd();
$scenario->setLog("Heure ".$ancienne_heure. " vs ".$nouvelle_heure);
//Température
if ($c_temperature != "") {
$scenario->setLog("Colonne température = ".$c_temperature);
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$c_temperature."]/span[1]");
$nouvelle_temp = $node[0]->nodeValue;
$scenario->setLog("Température ".$nouvelle_temp);
}
if ( ($nouvelle_heure != $ancienne_heure || $maj) && ($nouvelle_heure != "") && ($nouvelle_temp != "") ) {
//Mise à jour heure et température
$scenario->setLog("=> Mise à jour");
$cmd->event($nouvelle_heure);
cmd::byString("#[Météo][Infoclimat][Température]#")->event($nouvelle_temp);
//Pluie
if ($c_pluie != "") {
$scenario->setLog("Colonne pluie = ".$c_pluie);
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$c_pluie."]");
cmd::byString("#[Météo][Infoclimat][Pluie]#")->event($node[0]->nodeValue);
}
//Humidité
if ($c_humidite != "") {
$scenario->setLog("Colonne humidité = ".$c_humidite);
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$c_humidite."]/span[1]");
cmd::byString("#[Météo][Infoclimat][Humidité]#")->event($node[0]->nodeValue);
}
//Vent
if ($c_vent != "") {
$scenario->setLog("Colonne vent = ".$c_vent);
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$c_vent."]/span[2]");
$valeur = $node[0]->nodeValue;
if ($valeur == "km/h") {
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$c_vent."]/span[1]");
$valeur = $node[0]->nodeValue;
cmd::byString("#[Météo][Infoclimat][Vent]#")->event($node[0]->nodeValue);
}
}
}
Il semble que lorsque je clique pour copier le Xpath, le résultat que j’obtiens est différent du vôtre. J’ai sélectionné uniquement la ligne en question et j’obtiens :
Quoi qu’il en soit, je comprends que cette méthode de récupération n’est peut-être pas fiable à long terme, car une simple mise à jour du site peut rendre le code erroné. Je vais essayer de trouver une autre solution.
@seb821, est-ce que ta solution fonctionne de manière optimale dans la durée ?
Le Xpath est //*[@id="resptable-releves"]/tbody/tr[1]/td[3]/span[4]
Le Xpath complet est celui que vous obtenez: /html/body/div[8]/div[4]/div/div[4]/table/tbody/tr[1]/td[3]/span[4]
Avec Firefox, il n’y a que le Xpath complet.
La solution de seb821 est totalement dépendante de la structure du site infoclimat et du bon vouloir de son dev.
Ça ne pourrait être fiable et durable que si infoclimat proposait une API ( qui pourrait être payante ).
Dans le plugin-meteofrance , il y a une commande qui contient la vitesse actuelle des rafales de vent:
En faite, je souhaite obtenir une information fiable d’une station proche de chez moi, et non pas des infos de météo France qui sont prise je ne sais où… Probablement a plusieurs 10ene de km, a des altitudes différentes
J’ai aussi des accès a des centrale météo Netatmo proche de chez moi, mais ça dépend de l’installation (position par rapport au maison environnante, altitude etc …)
Les vents obtenu ne correspondent pas à la réalité malheureusement…
Sinon, j’ai plus a acheter une station perso lol.
Mais ça, j’ai mois le goût (et le budget surtout )
En fait, comment obtiens-tu la fiche MF pour connaître l’endroit exact de la station météo utilisée ?
Et s’agit-il de prévisions ou de prises de mesures « in situ » ?
La position de la station météo utilisée est fournie par MF dans les données de prévisions.
On interroge MF avec les coordonnées X.XXX et Y.YYY et MF fournit les prévisions pour la station la plus proche x.xxx et y.yyy