Google Weather API-解析和修改数据 [英] Google Weather API - parsing and modifying data

查看:118
本文介绍了Google Weather API-解析和修改数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题已不再最新-Google在2012年关闭了非官方的天气API

This question is no longer up-to-date -- Google shut down the unofficial weather API in 2012

我想在朋友的网页上添加一些天气预报. 当我发给

I'd like to put some weather forecast to a friend's web page. When I address for

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

浏览器使用以下代码将我想解析的正确内容返回到PHP:

The browser returns the right content I'd like to parse to PHP with this code:

<?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>

但是上面的代码无法正常工作,因为我使用的是"hr"而不是"en"(hr =克罗地亚语):

But the code above won't work because I used 'hr' instead of 'en' (hr = Croatian language):

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

是有效语法,但返回的数据为英文,温度为华氏温度.

is the working syntax but the returned data are in English and the temperature is in Fahrenheit.

我想这是一个错误的UTF-8编码属性的问题.

I suppose it's matter of a wrong UTF-8 encoding property.

我不知道如何获取确切的克罗地亚语文本并将F转换为摄氏度.

I do not know how to grab the exact Croatian text and convert degrees F into Celsius.

  1. 此后,我找到了 F-to-C解决方案的链接并更改了第19行:

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

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

(在当前版本中,我不使用它,因为它似乎可以处理摄氏温度.)

(I do not use it in the current version because it seems the API handles Celsius.)

要在将语言设置为"en"的同时将度数保持在C中,可以使用en-gb.

To keep the degrees in C while having language set to "en" at the same time you can use en-gb.

推荐答案

编码问题:

出于某种原因,Google返回了XML内容,但没有正确的编码声明.人们会期望像这样:

For some reason Google returns the XML content without proper encoding declaration. One would expect something like:

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

但是它们会跳过标头中的encoding属性.这使得simplexml_load_file函数采用UTF-8的默认编码.由于 XML规范定义了UTF- 8作为后备默认编码.

But they skip the encoding attribute in the header. This makes the simplexml_load_file function assume the default encoding of UTF-8. I would consider this a bug in their API implementation, since the XML spec defines UTF-8 as the fallback default encoding.

要对此进行补偿,请尝试以下操作:

To compesate for this, try something like:

<?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);
...

这似乎可行. ISO-8859-2的值是一个纯粹的猜测.

Which seems to work. The ISO-8859-2 value was a pure guess.

华氏温度/摄氏度:

在该API中,我看不到一种简单的方法来请求以摄氏度代替华氏温度提供温度数据(我找不到官方文档,我是盲人吗?).但是,从F到C的转换并不难.

I don't see an easy way to request the temperature data to be provided in Celsius instead of Fahrenheit in this API (I couldn't find the official doc, am I blind?). However conversion from F to C shouldn't be hard at all.

尝试以下公式:

(°F  -  32)  x  5/9 = °C

,您可以在数千个地方找到它.我来自 http://www.manuelsweb.com/temp.htm

which you can find in thousand of places. I took it from http://www.manuelsweb.com/temp.htm

这篇关于Google Weather API-解析和修改数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆