一般获取天气预报信息的方式有两种
1,调用第三方的api,获取需要信息
2,抓取网页内容,通过正则表达式匹配获得需要信息
当然你也可以直接找中央气象局的相关单位,从他们那里直接取得数据。
这里以Google的api为例,之所以没用雅虎的api是因为它的中国城市太少了,至少我在的无锡都没有
http://www.google.com/ig/api?hl=zh_CN&weather=wuhan 打开这个网址可以看到Google的返回结果
思路:
1,请求api地址,获取结果
2,将结果转换为dom文档
3,从dom文档中提取信息
一下为实现代码
require "net/http"
require "uri"
require "rexml/document"
require "iconv"
class Weather
WEATHER_URI = "http://www.google.com/ig/api?hl=en&weather=%city%"
# WEATHER_URI = "http://www.google.com/ig/api?hl=zh_CN&weather=%city%" # 包含中文的xml会解析失败,不知道为什么?
def initialize(city="beijing")
@city = city.strip
end
#取得天气预报结果,一个包含4个hash对象的数组
def weather_data
xml = xml_document
data = []
xml.root.get_elements("/xml_api_reply/weather/forecast_conditions").each do |element|
data << parse_element(element)
end
data
end
#解析xml文档单个元素,返回一个hash对象
def parse_element(element)
ha = {}
low_element = element.get_elements("low")[0]
high_element = low_element.next_element
icon_element = high_element.next_element
condition_element = icon_element.next_element
ha[:low] = to_c(low_element.attributes["data"].to_i)
ha[:high]= to_c(high_element.attributes["data"].to_i)
ha[:icon]= icon_element.attributes["data"]
ha[:conditon] = condition_element.attributes["data"]
ha
end
# 转换到摄氏度
def to_c(f)
(f - 32) * 5 / 9+1
end
#取得返回的xml文档
def xml_document
uri = WEATHER_URI.gsub(/%city%/,@city)
res = Net::HTTP.get_response(URI.parse(uri)).body
REXML::Document.new(res)
end
#类方法,方面调用,也算是入口
def self.get_weather(city=nil)
if city
self.new(city.strip).weather_data
else
self.new("beijing").weather_data
end
end
end
# ==================以下为在命令行输出之用===============
def day(num)
case num
when 0
"今日"
when 1
"明日"
when 2
"后天"
when 3
"大后天"
else
raise ""
end
end
i = 0
we = Weather.get_weather ARGV[0].strip
we.each do |w|
s = "#{day(i)},最高温度:#{w[:high]},最低温度:#{w[:low]},天气:#{w[:conditon]}"
s = Iconv.iconv("GB2312", "UTF-8", s) #在win命令行下显示中文
puts s
i+=1
end
测试
D:\myruby\study\RubyStudy\lib>ruby Weather.rb wuhan
今日,最高温度:29,最低温度:21,天气:Thunderstorm
明日,最高温度:27,最低温度:24,天气:Chance of Storm
后天,最高温度:29,最低温度:23,天气:Rain
大后天,最高温度:28,最低温度:23,天气:Thunderstorm
D:\myruby\study\RubyStudy\lib>ruby Weather.rb beijing
今日,最高温度:29,最低温度:21,天气:Chance of Rain
明日,最高温度:29,最低温度:21,天气:Chance of Rain
后天,最高温度:31,最低温度:22,天气:Chance of Rain
大后天,最高温度:36,最低温度:21,天气:Chance of Rain
两个缺陷
1,天气状况还未中文化,这属于我的原因,未进行中文化处理
2,Google的api貌似也不可靠,比如查询wuxi,有时就会显示没有相关信息。
分享到:
相关推荐
通过C#调用 google weather api 然后用xml解析显示天气信息
一个运用google weather api 显示最近三天天气的小例子 不过感觉google的天气不太准(天气预报好像没有准的^_^)
Google Weather 插件的功能是,可以在 Joomla 文章内容中显示一个简短的天气预报信息。 Google Weather 插件基本用法:{weather 城市名称,国家名称} 例如:{weather singapore}, {weather berlin,germany}, {weather...
Google Weather API非官方文档
谷歌天气预报api实例 vb.net的
Android 解析Google Weather API
android 天气预报 google api 完整源代码 很不错的
android 谷歌天气预报 android 谷歌天气预报android 谷歌天气预报
此资源仅实现了 最简单的天气预报查询功能 即选择或输入(拼音或汉字)一个城市 利用google天气api获得三天内的天气情况 设计中没有使用数据库 没有实现模糊查询功能
这些天气数据是通过后台服务获取的,这个后台服务按照一定时间间隔,从Google上获取天气预报信息,并将天气信息保存在后台服务中。示例还需要提供基于SMS短信的天气数据服务,其他手机用户可以向本示例所在的手机上...
基于googlemap api 的gps终端和用户管理系统基于googlemap api 的gps终端和用户管理系统基于googlemap api 的gps终端和用户管理系统基于googlemap api 的gps终端和用户管理系统基于googlemap api 的gps终端和用户...
安卓是谷歌于2008年推出的一个智能手机操作系统,其独特的设计模式使得开发手机软件变得非常简单。...基于手机的天气预报系统能够使用户对于各地的天气情况实时掌握,方便用户的出行和行程安排,具有一定的实用性。
├─05 实战Google Maps API之三——地图天气预报服务 │ ├─5.1 在Google地图上显示天气预报 │ │ ├─5.1.2 利用Google AJAX Feed API加载RSS文档 │ │ └─5.1.3 YWeather()类的构造 │ └─5.2 │ └─...
百度,谷歌,天气预报API应用实例,本人自己试过,完全好使,有问题联系我,邮箱:tootwo.love@163.com
1、项目介绍 系统实现了展示所有省份信息,及对应的城市信息,通过点击城市信息,可以获取当前所对应的天气信息。 系统采用servlet框架结构,json作为数据读取的数据源。...json数据格式化的转化采用谷歌组件gson
在google地图上面实现天气预报订阅!
Android天气预报程序源代码,获取的Google的天气API数据,自己可再次扩展,这里运行截图比较难抓,有环境的就下载源码测试吧,Android天气预报WeatherForecast似乎是常见而又简单的Android初级例子,但想开发出一款...
google地图和天气预报,开发中常用的东西,特别是做网站!
基于google的天气预报API,用J2ME的LWUIT开发,支持城市切换。 天气指示图片存于本地,减少了流量
使用Java获取Google的简单天气预报,内有详细代码.希望大家可以试试.