`
to_zoe_yang
  • 浏览: 142412 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

天气小工具 <三>

阅读更多
   之前我们能得到省份,市,区的唯一ID,则我们可以根据这个ID获得当前想要查看的地区的天气状况。
    继续使用我们的HttpWatch分析。例如我们希望知道江苏省南京市南京市区的天气状况。通过之前的城市ID分析,我们知道江苏省ID为10119,南京市ID01,南京市区ID为01,则查询ID为101190101,天气查询URL为:http://www.weather.com.cn/weather/101190101.shtml

这个返回的信息很符合HTML的标准。
我们可以使用HTMLParser提取信息,当然也可以使用正则表达式。
// 制定得到天气的Filter
			NodeFilter prosFilter = new TagNameFilter("table");
			NodeFilter prosAttrFilter = new HasAttributeFilter("class",
					"yuBaoTable");
			AndFilter filters = new AndFilter(prosFilter, prosAttrFilter);
			// 得到对应的天气
			NodeList nodes = parser.extractAllNodesThatMatch(filters);
			for (int i = 0; i < nodes.size(); i++) {
				Node node = nodes.elementAt(i);
				String weatherInfo = node.toPlainTextString();
				weatherInfo = weatherInfo.replaceAll("\\s", "");
}


因为提取出来的信息会有很多的空格符,就将其替换为空,weatherInfo.replaceAll("\\s", "");

最终得到的信息为:
15日星期三白天小雨高温23℃东风3-4级夜间阴低温19℃东风3-4级15日,星期三,白天:小雨,高温:高温23℃,风:东风,风力3-4级,夜间:阴,温度:低温19℃,风:东风,风力:3-4级
16日星期四白天阴高温28℃东风3-4级夜间多云低温21℃东南风3-4级16日,星期四,白天:阴,高温:高温28℃,风:东风,风力3-4级,夜间:多云,温度:低温21℃,风:东南风,风力:3-4级
17日星期五白天多云高温31℃东南风3-4级夜间阴低温23℃东南风3-4级17日,星期五,白天:多云,高温:高温31℃,风:东南风,风力3-4级,夜间:阴,温度:低温23℃,风:东南风,风力:3-4级
18日星期六白天雷阵雨高温28℃东风3-4级夜间中雨低温22℃东北风3-4级18日,星期六,白天:雷阵雨,高温:高温28℃,风:东风,风力3-4级,夜间:中雨,温度:低温22℃,风:东北风,风力:3-4级
19日星期日白天中雨高温25℃东北风3-4级夜间阵雨低温21℃东北风3-4级19日,星期日,白天:中雨,高温:高温25℃,风:东北风,风力3-4级,夜间:阵雨,温度:低温21℃,风:东北风,风力:3-4级
20日星期一白天阴高温29℃北风3-4级夜间多云低温22℃东风3-4级20日,星期一,白天:阴,高温:高温29℃,风:北风,风力3-4级,夜间:多云,温度:低温22℃,风:东风,风力:3-4级
21日星期二白天阴高温31℃东风3-4级21日,星期二,白天:阴,高温:高温31℃,风:东风,风力3-4级


为了方便信息,我们将每天的天气信息创建一个类。
类的属性有:日期,星期,白天天气,白天最高温,白天风向,白天风力,夜间天气,夜间最低温,夜间风向,夜间风力。

但是比较不爽的是,不是每天都会有白天信息或者夜间信息。例如21日。
所以在使用正则表达式提取上诉信息的时候分为三种情况:
1.白天和夜间都有
2.只有白天
3.只有夜间

不要抓狂,抓狂的来了。
不是所有的天气状况都是有风向和风力的。
我们得到了如下的天气状况:
15日星期三白天雷阵雨高温32℃无持续风向微风夜间中雨低温19℃无持续风向微风
竟然出现了什么无持续风向和微风。
好吧~使用正则表达式提取信息的时候,我们又得分出一种情况了!

代码如下:
参数content为城市天气信息页面返回的信息;
	public static Vector<Day> GetWeather(String content) {
		Vector<Day> days = new Vector<Day>();
		// 根据所获得的天气网页信息得到未来七天温度信息
		Parser parser;
		try {
			parser = new Parser(content);
			// 制定得到天气的Filter
			NodeFilter prosFilter = new TagNameFilter("table");
			NodeFilter prosAttrFilter = new HasAttributeFilter("class",
					"yuBaoTable");
			AndFilter filters = new AndFilter(prosFilter, prosAttrFilter);
			// 得到对应的天气
			NodeList nodes = parser.extractAllNodesThatMatch(filters);
			for (int i = 0; i < nodes.size(); i++) {
				Node node = nodes.elementAt(i);
				String weatherInfo = node.toPlainTextString();
				weatherInfo = weatherInfo.replaceAll("\\s", "");
//				System.out.print(weatherInfo);
				// 得到的天气信息有两种,一种白天和夜间都有,一种只有白天
				if (weatherInfo.indexOf("夜") != -1
						&& weatherInfo.indexOf("白") != -1) {
					String day = "", week = "", h_weather = "", high = "", h_wind = "", h_wind_level = "", l_weather = "", low = "", l_wind = "", l_wind_level = "";
					if (weatherInfo.indexOf("风向") != -1) {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherRegexNoWind);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							h_weather = adayMatcher.group(3);
							high = "高温" + adayMatcher.group(4) + "℃";
							h_wind = adayMatcher.group(5) + "风向"; // 白天的风向
							h_wind_level = adayMatcher.group(6) + "风"; // 风力
							l_weather = adayMatcher.group(7);
							low = "低温" + adayMatcher.group(8) + "℃";
							l_wind = adayMatcher.group(9) + "风向";
							l_wind_level = adayMatcher.group(10) + "风";
						}
					} else {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherRegex);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							h_weather = adayMatcher.group(3);
							high = "高温" + adayMatcher.group(4) + "℃";
							h_wind = adayMatcher.group(5) + "风"; // 白天的风向
							h_wind_level = adayMatcher.group(6) + "级"; // 风力
							l_weather = adayMatcher.group(7);
							low = "低温" + adayMatcher.group(8) + "℃";
							l_wind = adayMatcher.group(9) + "风";
							l_wind_level = adayMatcher.group(10) + "级";
						}
					}
					Day aday = new Day(day, week, h_weather, high, h_wind,
							h_wind_level, l_weather, low, l_wind, l_wind_level);
					days.add(aday);
//					System.out.println(aday);

				} else if (weatherInfo.indexOf("白") != -1) {
					String day = "", week = "", h_weather = "", high = "", h_wind = "", h_wind_level = "";
					if (weatherInfo.indexOf("风向") != -1) {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherDayRegexNoWind);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							h_weather = adayMatcher.group(3);
							high = "高温" + adayMatcher.group(4) + "℃";
							h_wind = adayMatcher.group(5) + "风向"; // 白天的风向
							h_wind_level = adayMatcher.group(6) + "风"; // 风力
						}
					} else {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherDayRegex);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							h_weather = adayMatcher.group(3);
							high = "高温" + adayMatcher.group(4) + "℃";
							h_wind = adayMatcher.group(5) + "风"; // 白天的风向
							h_wind_level = adayMatcher.group(6) + "级"; // 风力
						}
					}
					Day aday = new Day(day, week, h_weather, high, h_wind,
							h_wind_level, "", "", "", "");
					days.add(aday);
//					System.out.println(aday);
				} else {
					String day = "", week = "", l_weather = "", low = "", l_wind = "", l_wind_level = "";
					if (weatherInfo.indexOf("风向") != -1) {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherNightRegexNoWind);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							l_weather = adayMatcher.group(3);
							low = "低温" + adayMatcher.group(4) + "℃";
							l_wind = adayMatcher.group(5) + "风向";
							l_wind_level = adayMatcher.group(6) + "风";
						}
					} else {
						Pattern adayPattern = Pattern
								.compile(MyRegex.WeatherNightRegex);
						Matcher adayMatcher = adayPattern.matcher(weatherInfo);
						while (adayMatcher.find()) {
							day = adayMatcher.group(1);
							week = adayMatcher.group(2);
							l_weather = adayMatcher.group(3);
							low = "低温" + adayMatcher.group(4) + "℃";
							l_wind = adayMatcher.group(5) + "风";
							l_wind_level = adayMatcher.group(6) + "级";

						}
						Day aday = new Day(day, week, "", "", "", "",
								l_weather, low, l_wind, l_wind_level);
						days.add(aday);
//						System.out.println(aday);
					}
				}
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return days;
	}



这部分其实就是信息的提取和分析。


目前测试使用的界面
分享到:
评论

相关推荐

    ASP.NET2.0典型模块(1-16)

    &lt;br&gt; RSS工具包 Microsoft提供的RSS工具组件&lt;br&gt; 源代码\SimpleReader.aspx 简单RSS阅读器&lt;br&gt; 源代码\ ComplexRSS.aspx 复杂RSS阅读器&lt;br&gt;&lt;br&gt;第6章(\C06)&lt;br&gt;示例描述:本章介绍了在线编辑器的原理及实现。...

    上古办公助手CRM 商务版

    文本简繁转换(有台湾省的文档和业务吗)、机密信息的加密解密、文档拼音标注、办公文档批量转文本文件、还有好看实用的图表生成工具(支持二维、三维和靓彩哦,为您的数据表贴上与众不同的图表,看起来绝对不错),...

    Webservice入门教程_编写天气预报的webservice示例代码

    要创建天气预报Web服务,首先需要选择一个开发工具,如Java的Apache CXF或.NET的ASP.NET Web Services。以下是一个基本步骤概述: 1. 定义服务接口:定义一个接口,该接口声明提供天气预报所需的方法,例如`...

    Widget3.1中文技术手册

    - **应用范围**:适用于快速开发桌面小工具,如天气预报、新闻摘要、股票行情等。 #### 二、Widget Engine 架构与语法 - **XML语法**:Widget Engine使用XML作为描述语言。XML是一种标记语言,具备良好的结构化...

    天气API接口

    #### 三、天气API接口的使用方法 - **基本URL结构**: - 基础地址:`http://wthrcdn.etouch.cn/` - 接口路径:`weather_mini` 或 `WeatherApi` - 参数:`city=` 或 `citykey=` - **请求示例**: - JSON 格式:...

    【Web网页设计制作-毕业设计期末大作业】HTML、CSS、JavaScript前端网页项目源码H439.zip

    在这个项目中,HTML文件可能包含了各种页面元素,如标题(`&lt;h1&gt;`至`&lt;h6&gt;`)、段落(`&lt;p&gt;`)、图像(`&lt;img&gt;`)、链接(`&lt;a&gt;`)、列表(`&lt;ul&gt;`和`&lt;ol&gt;`)、表格(`&lt;table&gt;`)等。此外,HTML5引入了更多的语义化标签,...

    微信小程序视频教程全集

    - **技术选型**:利用`wx.request`请求第三方天气API,使用`&lt;view&gt;`、`&lt;text&gt;`等基础组件展示天气信息。 - **实现步骤**: - 创建新项目,配置API接口。 - 编写页面逻辑代码,处理用户输入。 - 调用API获取天气...

    win7 桌面,天气小工具修正补丁包,支持中国城市

    4. **解决冲突**:如果与第三方软件存在冲突,补丁包会尝试自动调整设置,使天气小工具能够正常工作。 使用方法: 1. 下载并解压“WIN7桌面工具‘天气’”压缩包。 2. 关闭所有正在运行的Windows 7系统,并确保...

    自主制作静态网页

    可能涉及的库和框架有jQuery用于简化DOM操作,Google Maps API用于地图功能,以及可能的第三方API(如OpenWeatherMap)用于天气信息。JavaScript也可以处理用户输入验证,提交表单,甚至与后端进行异步数据交换(如...

    SAX编程技术

    5. `characters("&lt;POEM&gt;",15,10)`:处理`&lt;AUTHOR&gt;`标签内的文本。 6. `endElement("AUTHOR")`:遇到`&lt;/AUTHOR&gt;`标签时调用。 7. ...以此类推,直到`endDocument()`,表示文档解析结束。 ##### 3. SAX的不足 尽管...

    Google 小工具 API

    - `&lt;ModulePrefs&gt;`: 包含小工具的元数据,如标题。 - `&lt;Content type="html"&gt;`: 指定内容类型为HTML。 - `&lt;![CDATA[...]]&gt;`: 定义CDATA段落,用于包含HTML或JavaScript代码。 #### 六、小工具的组成部分 - **...

    HTML5开发技术

    1. **语义化标签**:HTML5引入了新的语义化标签,如&lt;header&gt;、&lt;footer&gt;、&lt;article&gt;、&lt;section&gt;和&lt;nav&gt;等,这些标签帮助开发者更清晰地定义页面结构,使内容更容易被理解和解析,对搜索引擎优化(SEO)非常有利。...

    这是一个有关自己家乡的个人旅游网站的设计与制作,通过HTML,css,JavaScript等语言进行完整的制作整个网站.zip

    在这个项目中,HTML文件可能包含了各种元素,如`&lt;head&gt;`(头部信息)、`&lt;body&gt;`(主体内容)、`&lt;header&gt;`(页眉)、`&lt;nav&gt;`(导航)、`&lt;section&gt;`(分段)、`&lt;article&gt;`(文章)、`&lt;footer&gt;`(页脚)等,用于组织...

    天气显示小工具

    《构建桌面天气小工具——基于MFC的实现详解》 在IT行业中,开发实用的桌面应用是提升用户体验的重要途径之一。本篇文章将深入探讨如何利用Microsoft Foundation Classes (MFC)库,结合Visual Studio 2010开发一个...

    weatherapp:天气预报应用

    2. 内容元素:利用&lt;h1&gt;至&lt;h6&gt;定义标题级别,&lt;p&gt;定义段落,&lt;img&gt;插入图片(如天气图标)。此外,&lt;a&gt;标签可以创建链接,让用户能分享当前天气信息到社交媒体。 二、天气信息展示 为了让用户快速获取天气信息,我们...

    C#天气预报小程序

    在本文中,我们将深入探讨如何使用C#编程语言开发一个天气预报小程序,这是一个基于Windows的桌面应用程序,可以显示用户指定城市的当前天气以及未来三天的预报。这个程序利用第三方天气API来获取实时数据,并以用户...

    前端学习路线-初级01

    - 常用标签:`&lt;a&gt;`, `&lt;img&gt;`, `&lt;div&gt;`, `&lt;span&gt;`等。 - 表单元素:`&lt;input&gt;`, `&lt;select&gt;`, `&lt;textarea&gt;`等。 - **实践建议:** - 尝试构建简单的个人主页或博客页面。 - 参考W3School等在线资源进行练习。 ###...

    weatherapp

    可以使用`&lt;header&gt;`标签创建头部区域,`&lt;img&gt;`标签插入Logo图片,`&lt;input&gt;`创建搜索框,用户输入城市名查询天气。 4. **展示天气信息**: 在主体部分,可以创建多个`&lt;section&gt;`或`&lt;article&gt;`元素来分别展示当前...

    天天win7桌面天气小工具 v3.5.zip

    天天win7桌面天气小工具支持全国各城市天气,有实时天气温度,日历,紫外线强度空气质量,鼠标移动到界面可以显示未来三天内天气情况,外观大方美观,可以做桌面插件使用。 天天win7桌面天气小工具 v3.5更新内容...

Global site tag (gtag.js) - Google Analytics