# 喜欢自己编写皮肤的可以进来看看:关于天气、WebParser、正则表达式 - Rainmeter技术教程 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 67002|回复: 260

[技术交流] 喜欢自己编写皮肤的可以进来看看:关于天气、WebParser、正则表达式

  [复制链接]

签到天数: 82 天

[LV.6]常住居民II

发表于 2012-8-9 23:33:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?点击注册

x
本帖最后由 Geterns 于 2012-8-10 00:00 编辑

作为新手,我们编写皮肤代码通常是从参考别人的代码开始的。
但是最近在做天气皮肤的时候发现,这个皮肤的代码很多都写得比较乱,很难看懂,不利于新手理解。本人计算机专业的大学生,对代码这东西算是上手比较快吧,在论坛平时也不水贴,经验混不起来,所以发一篇技术贴,算是帮各位初学的童鞋扫盲,也顺便拿点经验吧!

目前国内的天气皮肤用的基本是这两个URL的,所以就以此为例
天气实况:http://www.weather.com.cn/data/sk/#CODE#.html
6天天气预报详情:http://m.weather.com.cn/data/#CODE#.html
例如广州的城市代码101280101,用浏览器打开http://www.weather.com.cn/data/sk/101280101.html 就可以看到相应的天气实况信息。
然后用WebParser来抓取其中的有用信息:
  1. [MeasureWeatherNOW]
  2. Measure=Plugin
  3. Plugin=Plugins\WebParser.dll
  4. Url=http://www.weather.com.cn/data/sk/#CODE#.html
  5. RegExp="{"weatherinfo":{"city":"(.*)","cityid":"(.*)","temp":"(.*)","WD":"(.*)","WS":"(.*)","SD":"(.*)","WSE":"(.*)","time":"(.*)","isRadar":"(.*)","Radar":"(.*)"}}"
  6. UpdateRate=#RATE#
  7. StringIndex=1
复制代码
其中的RegExp,也就是正则表达式,就是这个插件的关键。正则表达式,其实是一门大学课程,涉及的内容很多,不过在WebParser这个插件中用到的是一个简化版本的正则表达式,所以我就只挑有用的讲吧~
要点1:皮肤文件中的正则表达式应该用英文引号括起来,比如RegExp="abcd(.*)fgh",不过实际使用发现不加双引号也没什么问题
要点2:认识一下正则表达式中的几个特殊字符:
(1)英文句点 .   它是一个通配符,在正则表达式中用这个英文句点来匹配任意字符;
(2)星号 *  它表示一个匹配模式,重复0或多次;
(3)配对的英文圆括号 () 圆括号内的内容就是这个WebParser返回的内容。
实际使用中,最常用的两个组合是.*和(.*),前者匹配内容但是不返回,后者匹配并返回内容。
举个例子,我们在Url=http://www.weather.com.cn/data/sk/#CODE#.html下载下来的内容是:
  1. {"weatherinfo":{"city":"广州","cityid":"101280101","temp":"29","WD":"南风","WS":"2级","SD":"69%","WSE":"2","time":"20:25","isRadar":"1","Radar":"JC_RADAR_AZ9200_JB"}}
复制代码
使用的正则表达式是:
  1. {"weatherinfo":{"city":"(.*)","cityid":"(.*)","temp":"(.*)","WD":"(.*)","WS":"(.*)","SD":"(.*)","WSE":"(.*)","time":"(.*)","isRadar":"(.*)","Radar":"(.*)"}}
复制代码
那么这个WebParser实际的内容是
  1. StringIndex=1的时候得到第1个(.*)位置的内容:广州
  2. StringIndex=2的时候得到第2个(.*)位置的内容:101280101
  3. StringIndex=3的时候得到第3个(.*)位置的内容:29
  4. 以此类推……
复制代码
要点3:重用。上述的正则表达式中共有10处(.*),也就是说它会返回10个字符串,也就是说StringIndex可以是1到10的任意一个。所以,我们写好第一个WebParser以后,后续的WebParser就不用再使用那个网址了,而是直接使用已经下载分析好的[MeasureWeatherNOW],例如
  1. [WebParser2]
  2. Measure=Plugin
  3. Plugin=Plugins\WebParser.dll
  4. Url=[MeasureWeatherNOW]
  5. UpdateRate=#RATE#
  6. StringIndex=2
复制代码
要点4:贪心策略。这是正则表达式匹配的一种策略,继续以上面的内容为例:
我们在Url=http://www.weather.com.cn/data/sk/#CODE#.html下载下来的内容是:
  1. {"weatherinfo":{"city":"广州","cityid":"101280101","temp":"29","WD":"南风","WS":"2级","SD":"69%","WSE":"2","time":"20:25","isRadar":"1","Radar":"JC_RADAR_AZ9200_JB"}}
复制代码
假如我现在只想要得到那个温度,其他信息不需要,正则表达式可以这样写:
  1. .*"temp":"(.*)","WD".*
复制代码
这样这个表达式得到的内容就是29。更简单一点,那么写成这样行不行呢:
  1. .*"temp":"(.*)",".*
复制代码
答案是不行。这样得到的内容是:
  1. 29","WD":"南风","WS":"2级","SD":"69%","WSE":"2","time":"20:25","isRadar":"1
复制代码
这就说所谓的“贪心策略”,匹配的时候会尽量匹配更长的内容,所以会匹配到最后一处","的时候才结束

附一个我自己编写的未来三天的天气预报代码(CODE是城市代码),大约200行,鼠标放在天气图标上时会显示相应的未来天气变化趋势。气象图我加了前缀GT(比如“GT晴.png”“GT大雨.png”“GT暴雪.png”等),这样在WebParser更新失败时(返回空字符串)就会显示默认的气象图“GT.png”
Weather.zip (456.56 KB, 下载次数: 741)

评分

参与人数 1活跃值 +2 收起 理由
xiaochou_feng + 2 我太喜欢这个资源啦(ノ°ο°)??.

查看全部评分

回复

使用道具 举报

签到天数: 82 天

[LV.6]常住居民II

 楼主| 发表于 2012-8-9 23:49:19 | 显示全部楼层

PS,一个编写天气皮肤的建议
例如http://m.weather.com.cn/data/101280101.html 的内容如下
  1. {"weatherinfo":{"city":"广州","city_en":"guangzhou","date_y":"2012年8月9日","date":"","week":"星期四","fchh":"18","cityid":"101280101","temp1":"25℃~35℃","temp2":"26℃~34℃","temp3":"26℃~33℃","temp4":"25℃~32℃","temp5":"25℃~33℃","temp6":"26℃~33℃","tempF1":"77℉~95℉","tempF2":"78.8℉~93.2℉","tempF3":"78.8℉~91.4℉","tempF4":"77℉~89.6℉","tempF5":"77℉~91.4℉","tempF6":"78.8℉~91.4℉","weather1":"多云","weather2":"多云转阵雨","weather3":"多云转阵雨","weather4":"阵雨","weather5":"阵雨","weather6":"多云转阵雨","img1":"1","img2":"99","img3":"1","img4":"3","img5":"1","img6":"3","img7":"3","img8":"99","img9":"3","img10":"99","img11":"1","img12":"3","img_single":"1","img_title1":"多云","img_title2":"多云","img_title3":"多云","img_title4":"阵雨","img_title5":"多云","img_title6":"阵雨","img_title7":"阵雨","img_title8":"阵雨","img_title9":"阵雨","img_title10":"阵雨","img_title11":"多云","img_title12":"阵雨","img_title_single":"多云","wind1":"微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"微风","fx2":"微风","fl1":"小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"炎热","index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。","index48":"炎热","index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。","index_uv":"中等","index48_uv":"中等","index_xc":"不宜","index_tr":"一般","index_co":"很不舒适","st1":"35","st2":"25","st3":"32","st4":"26","st5":"31","st6":"26","index_cl":"较适宜","index_ls":"适宜","index_ag":"极不易发"}}
复制代码
这里面预报了从当天起6天的天气。一般某一天的天气是“XX转XX”,比如“多云转阴”,“雷阵雨转阵雨”等等,前面的表示当天的大体天气状况,“转”后面的表示未来的发展趋势。这里面img_title1到img_title12刚好就是这12个对应气象图的名称。
我建议在显示气象图片的时候应该截取img_title1到img_title12的内容(而不是现在大多数天气皮肤使用的,img1到img12的内容)。然后我们在皮肤的文件夹里面把对应的图片命名成“晴.png”“阴.png”“多云.png”“小雨.png”“中雨.png”等等,这样既直观,又有利于以后修改~
回复

使用道具 举报

签到天数: 141 天

[LV.7]常住居民III

发表于 2012-8-10 09:33:23 | 显示全部楼层
果然是技术贴、 没有看懂
回复

使用道具 举报

签到天数: 16 天

[LV.4]偶尔看看III

发表于 2012-8-10 09:37:48 | 显示全部楼层
技术贴, 非常喜欢,收藏了
回复

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2012-8-10 10:48:59 | 显示全部楼层
技术贴, 非常喜欢
回复

使用道具 举报

签到天数: 12 天

[LV.3]偶尔看看II

发表于 2012-8-10 11:29:49 | 显示全部楼层
技术贴,一个P都没看懂啊、、、不过亲,幸苦了啊
回复

使用道具 举报

签到天数: 145 天

[LV.7]常住居民III

发表于 2012-8-10 14:02:36 | 显示全部楼层
看不太懂,不过还是支持一下。
回复

使用道具 举报

签到天数: 82 天

[LV.6]常住居民II

 楼主| 发表于 2012-8-10 15:15:49 | 显示全部楼层
T.T 有木有能看懂的童鞋 举个手啊

点评

没 看 懂  发表于 2014-1-4 22:31
回复

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2012-8-12 23:14:08 | 显示全部楼层
对于我这个新手非常有用。多谢分享了。
回复

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

发表于 2012-8-27 11:57:00 | 显示全部楼层
果断不懂~~ 但是还是谢了~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

快速回复 返回顶部 返回列表