1 #需求:查詢地區天氣 2 #分析:第一步,抓取上面所有的天氣信息 3 4 from html.parser import HTMLParser 5 from urllib import request 6 import pickle 7 import json 8 9 #解析中國天氣網HTML 10 class WeatherHtmlParser(HTMLParser): 11 def __init__(self): 12 self.flag = False 13 self.weather_data = None 14 super(WeatherHtmlParser,self).__init__() 15 16 def handle_starttag(self,tag,attr): 17 if tag == "script": 18 self.flag = True 19 20 def handle_endtag(self,tag): 21 if tag == "script": 22 self.flag = False 23 24 def handle_data(self,data): 25 if self.flag: 26 if "var hour3data=" in data: 27 data = data.strip("\n") 28 data = data.strip("var hour3data=") 29 self.weather_data = json.loads(data) 30 31 32 #全國城市天氣預報代碼 33 class CityCodeHtmlParser(HTMLParser): 34 35 def __init__(self): 36 self.flag = False 37 self.city_dict = {} 38 super(CityCodeHtmlParser,self).__init__() 39 40 def handle_starttag(self,tag,attr): 41 if tag == "p" or tag == "br": 42 self.flag = True 43 44 def handle_endtag(self,tag): 45 if tag == "p" or tag == "br": 46 self.flag = False 47 48 def handle_data(self,data): 49 if self.flag: 50 if "=" in data: 51 data = data.split("=") 52 self.city_dict[data[1]] = data[0] 53 54 55 def printWeatherInfo(func): 56 def call(): 57 info = func() 58 if info == None: 59 return None 60 61 #一天之內的天氣 62 one_day = info["1d"] 63 for item in one_day: 64 item = item.split(",") 65 print("%s::天氣:%s; 溫度:%s; 風向:%s; 風力:%s" % (item[0],item[2],item[3],item[4],item[5])) 66 67 #未來7天內的天氣 68 flag = input("是否打印未來7天內的天氣:") 69 if flag == "是": 70 seven_day = info["7d"] 71 for i in range(7): 72 if i >= 1: 73 for item in seven_day[i]: 74 item = item.split(",") 75 print("%s::天氣:%s; 溫度:%s; 風向:%s; 風力:%s" % (item[0],item[2],item[3],item[4],item[5])) 76 else: 77 return None 78 79 return call 80 81 82 83 #抓取天氣信息 84 @printWeatherInfo 85 def getAllWeather(): 86 city = input("請輸入你要查詢的城市:") 87 city = queryCityCode(city) 88 if city == None: 89 return None 90 url_address = "http://www.weather.com.cn/weather1d/%s.shtml" % city 91 req = request.Request(url_address) 92 req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36") 93 with request.urlopen(req) as html: 94 data = html.read().decode("utf-8") 95 html_parser = WeatherHtmlParser() 96 html_parser.feed(data) 97 html_parser.close() 98 return html_parser.weather_data 99 100 101 102 #查詢城市的編碼 103 def queryCityCode(city_name): 104 105 #從網上抓取信息,本來我是想放在文件里的,博客園傳不了,我稍微改造了下 106 #目前代碼很丑,先做個記錄吧,現在畢竟沒工作,先把總體的知識過一遍再說 107 def getAllCityInfo(): 108 url_address = "http://doc.orz520.com/a/doc/2014/0322/2100581.html" 109 req = request.Request(url_address) 110 req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36") 111 with request.urlopen(req) as html: 112 data = html.read().decode("utf-8") 113 html_parser = CityCodeHtmlParser() 114 html_parser.feed(data) 115 html_parser.close() 116 return html_parser.city_dict 117 118 city_dict = getAllCityInfo() 119 if city_name not in city_dict: 120 return None 121 return city_dict[city_name] 122 123 124 getAllWeather() 125 aa = input()