Geterns 发表于 2012-8-9 23:33:17

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

本帖最后由 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来抓取其中的有用信息:

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

Geterns 发表于 2012-8-9 23:49:19


PS,一个编写天气皮肤的建议
例如http://m.weather.com.cn/data/101280101.html 的内容如下 {"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”等等,这样既直观,又有利于以后修改~

繁苛 发表于 2012-8-10 09:33:23

果然是技术贴、 没有看懂

phoebelin 发表于 2012-8-10 09:37:48

技术贴, 非常喜欢,收藏了

qq1213603839 发表于 2012-8-10 10:48:59

技术贴, 非常喜欢

范点、小2 发表于 2012-8-10 11:29:49

技术贴,一个P都没看懂啊、、、不过亲,幸苦了啊

smq8291000 发表于 2012-8-10 14:02:36

看不太懂,不过还是支持一下。

Geterns 发表于 2012-8-10 15:15:49

T.T 有木有能看懂的童鞋 举个手啊

leiyu4545 发表于 2012-8-12 23:14:08

对于我这个新手非常有用。多谢分享了。

樱井家的男孩 发表于 2012-8-27 11:57:00

果断不懂~~ 但是还是谢了~~
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 喜欢自己编写皮肤的可以进来看看:关于天气、WebParser、正则表达式