Google Weather API – l’analisi e la modifica dei dati

Questa domanda non è più up-to-date-Google arrestare il non ufficiale meteo API nel 2012


Vorrei mettere alcune previsioni del tempo a casa di un amico pagina web.
Quando mi rivolgo per

http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr

Il browser restituisce il contenuto che mi piacerebbe analizzare PHP con questo codice:

<?php
$xml = simplexml_load_file('http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr');
$information = $xml->xpath("/xml_api_reply/weather/forecast_information");
$current = $xml->xpath("/xml_api_reply/weather/current_conditions");
$forecast_list = $xml->xpath("/xml_api_reply/weather/forecast_conditions");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>VREMENSKA PROGNOZA</title>
</head>
    <body>
        <h1><?= print $information[0]->city['data']; ?></h1>
        <h2>Danas</h2>
        <div class="weather">
            <img src="<?= 'http://www.google.com' . $current[0]->icon['data']?>" alt="weather"?>
            <span class="condition">
            <?= $current[0]->temp_f['data'] ?>&deg; F,
            <?= $current[0]->condition['data'] ?>
            </span>
        </div>
        <h2>Prognoza</h2>
        <?php foreach ($forecast_list as $forecast) : ?>
        <div class="weather">
            <img src="<?= 'http://www.google.com' . $forecast->icon['data']?>" alt="weather"?>
            <div><?= $forecast->day_of_week['data']; ?></div>
            <span class="condition">
                <?= $forecast->low['data'] ?>&deg; F - <?= $forecast->high['data'] ?>&deg; F,
                <?= $forecast->condition['data'] ?>
            </span>
        </div>
        <?php endforeach ?>
    </body>
</html>

Ma il codice sopra non funziona, perché ho usato ‘hr’ invece di ‘it’ (hr = lingua croata):

$xml = simplexml_load_file('http://www.google.com/ig/api?weather=koprivnica,croatia&hl=en')

è la sintassi, ma i dati restituiti sono in inglese e la temperatura è in gradi Fahrenheit.

Suppongo che si tratta di una errata codifica UTF-8 di proprietà.

Non so come catturare l’esatta croato testo e la conversione gradi fahrenheit in Celsius.


  1. Ho trovato poi un link al F-a-C per la soluzione e cambiato linea 19:

    <?= $current[0]->temp_f['data'] ?>&deg; F,

    per

    <?= $current[0]->temp_c['data'] ?>&deg; C,

    (Io non lo uso nella versione attuale, perché sembra che l’API maniglie Celsius.)

  2. Per mantenere i gradi in C, pur avendo impostato come lingua “it”, allo stesso tempo, è possibile utilizzare en-gb.

  • Cosa intendi per “non funziona”? Un messaggio di errore?



2 Replies
  1. 6

    Problema di codifica:

    Per qualche motivo Google restituisce il contenuto XML senza un’adeguata dichiarazione di codifica. Uno si aspetterebbe qualcosa di simile:

    <?xml version='1.0' encoding='ISO-8859-2'?>

    Ma saltare l’attributo di codifica nell’intestazione. Questo rende il simplexml_load_file funzione assume il valore predefinito di codifica UTF-8. Vorrei considerare questo un bug nel loro implementazione dell’API, dal momento che il Specifica XML definisce UTF-8 come fallback codifica predefinita.

    Per compesate per questo, provare qualcosa di simile:

    <?php
    $URL = "http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr";
    $dataInISO = file_get_contents($URL);
    $dataInUTF = mb_convert_encoding($dataInISO, "UTF-8", "ISO-8859-2");
    $xml = simplexml_load_string($dataInUTF);
    ...

    Che sembra funzionare. ISO-8859-2 il valore è una pura congettura.

    Fahrenheit/Celsius:

    Non riesco a vedere un modo semplice per richiedere i dati di temperatura per essere fornito in gradi Celsius invece di Fahrenheit in questa API (non riuscivo a trovare l’ufficiale doc, io sono cieco?). Tuttavia la conversione da F a C non dovrebbe essere difficile a tutti.

    Provare questa formula:

    F  -  32)  x  5/9 = °C

    che si possono trovare in migliaia di luoghi. L’ho preso da http://www.manuelsweb.com/temp.htm

    • Sì, ho provato con tutti i tipi di <?xml version='1.0' encoding=' [types] '?> Ma, questo script del tuo! … Non ho altre parole da: GENIO! Vi ringrazio soo molto! Ora devo solo far lavorare i Celsius! 😉

Lascia un commento