使用BeautifulSoup抓取天气预报信息并通过wxPython可视化显示
网上好多关于Python各种爬虫以及可视化学习的文章,本人最近刚开始学习python,利用网上资源学习编写了第一个python程序,现将代码传上,供新手参考练习。
环境 WIN7 64位操作系统,pythonV3.63, PyCharm 可直接运行
#! /usr/bin/env python #! encoding:utf-8 #----------------------------------------------# # 使用wxPython,BeautifulSoup 编写 # # 抓取天气预报信息 PythonV3.63 # # 作者: Jack # # 日期: 2018-03-23 # #----------------------------------------------# import wx from urllib.request import urlopen from bs4 import BeautifulSoup # 城市编号字典 sCityDictionary = { '南京':'101190101', '成都':'101270101', '合肥':'101220101', '天门':'101201501', '深圳':'101280601', '广州':'101280101', '北京':'101010100', '上海':'101020100', '武汉':'101200101', '重庆':'101040100', '纽约':'401110101', '伦敦':'201010100', '洛杉矶':'401040101', '巴黎':'202010100', '东京':'103010100', '墨尔本':'601060101', '悉尼':'601020101', '伊斯坦布尔':'215550100', '莫斯科':'208010100', '华盛顿':'401620100'} class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title,size = (640,160)) panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) #self.btn = wx.Button(panel,-1,"查询",pos = (300,200)) #vbox.Add(self.btn,0,wx.ALIGN_CENTER) #self.btn.Bind(wx.EVT_BUTTON,self.OnClicked) self.radioBj = wx.RadioButton(panel, -1, "北京", pos=(350, 10)) vbox.Add(self.radioBj,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioBj) self.radioSh = wx.RadioButton(panel, -1, "上海", pos=(400, 10)) vbox.Add(self.radioSh,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioSh) self.radioGz = wx.RadioButton(panel, -1, "广州", pos=(350, 30)) vbox.Add(self.radioGz,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioGz) self.radioSz = wx.RadioButton(panel, -1, "深圳", pos=(400, 30)) vbox.Add(self.radioSz,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioSz) self.radioNj = wx.RadioButton(panel, -1, "南京", pos=(350, 50)) vbox.Add(self.radioNj,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioNj) self.radioHf = wx.RadioButton(panel, -1, "合肥", pos=(400, 50)) vbox.Add(self.radioHf,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioHf) self.radioWh = wx.RadioButton(panel, -1, "武汉", pos=(350, 70)) vbox.Add(self.radioWh,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioWh) self.radioTm = wx.RadioButton(panel, -1, "天门", pos=(400, 70)) vbox.Add(self.radioTm,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioTm) self.radioCq = wx.RadioButton(panel, -1, "重庆", pos=(350, 90)) vbox.Add(self.radioCq,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioCq) self.radioCd = wx.RadioButton(panel, -1, "成都", pos=(400, 90)) vbox.Add(self.radioCd,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioCd) self.radioNewyork = wx.RadioButton(panel, -1, "纽约", pos=(450, 10)) vbox.Add(self.radioNewyork,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioNewyork) self.radioLsj = wx.RadioButton(panel, -1, "洛杉矶", pos=(450, 30)) vbox.Add(self.radioLsj,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioLsj) self.radioLondon = wx.RadioButton(panel, -1, "伦敦", pos=(450, 50)) vbox.Add(self.radioLondon,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioLondon) self.radioPl = wx.RadioButton(panel, -1, "巴黎", pos=(450, 70)) vbox.Add(self.radioPl,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioPl) self.radioDj = wx.RadioButton(panel, -1, "东京", pos=(450, 90)) vbox.Add(self.radioDj,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioDj) self.radioXn = wx.RadioButton(panel, -1, "悉尼", pos=(510, 10)) vbox.Add(self.radioXn,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioXn) self.radioMrb = wx.RadioButton(panel, -1, "墨尔本", pos=(510, 30)) vbox.Add(self.radioMrb,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioMrb) self.radioEst = wx.RadioButton(panel, -1, "伊斯坦布尔", pos=(510, 50)) vbox.Add(self.radioEst,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioEst) self.radioMsk = wx.RadioButton(panel, -1, '莫斯科', pos=(510, 70)) vbox.Add(self.radioMsk,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioMsk) self.radioHsd = wx.RadioButton(panel, -1, "华盛顿", pos=(510, 90)) vbox.Add(self.radioHsd,0,wx.ALIGN_CENTER) self.Bind(wx.EVT_RADIOBUTTON, self.sSelectCity, self.radioHsd) self.lblWeather = wx.StaticText(panel,-1,pos = (10,10),style = wx.ALIGN_LEFT) vbox.Add(self.lblWeather,0,wx.ALIGN_CENTER) self.Centre() self.Show() self.Fit() #提取天气信息 def getWeather(self,sscid): #print(sscid) tagurl = 'http://www.weather.com.cn/weather/' + sscid + '.shtml' resp = urlopen(tagurl) soup = BeautifulSoup(resp, 'html.parser') tagDate = soup.find('ul', class_="t clearfix") dates = tagDate.h1.string tagToday = soup.find('p', class_="tem") try: temperatureHigh = tagToday.span.string except AttributeError as e: temperatureHigh = tagToday.find_next('p', class_="tem").span.string # 获取地址 tagAddr = soup.find('div', class_="crumbs fl") citys = '' for k in tagAddr.find_all('a'): # 查a标签的href值 citys = citys + k.string if citys == '': citys = tagAddr.string.replace('\r\n\t\t\t\t','',1) citys = citys.replace('\r\n\t\t\t','',1) citys = citys.replace('>','',1) temperatureLow = tagToday.i.string weather = soup.find('p', class_="wea").string tagWind = soup.find('p', class_="win") winL = tagWind.i.string listWeather = [citys, dates, winL, temperatureLow, temperatureHigh, weather] citys = '城市: ' + listWeather[0] + '\n' dates = '今天是:' + listWeather[1] + '\n' winL = '风级:' + listWeather[2] + '\n' temperatureLow = '最低温度:' + listWeather[3] + '\n' temperatureHigh = '最高温度:' + listWeather[4] + '\n' weather = '天气:' + listWeather[5] + '\n' listWeather = [citys, dates, winL, temperatureLow, temperatureHigh, weather] print(listWeather) self.lblWeather.SetLabel(listWeather[0]+listWeather[1]+listWeather[2]+listWeather[3]+listWeather[4]+listWeather[5]) self.lblWeather.SetForegroundColour((255,0,255)) #self.lblWeather.SetBackgroundColour((0,0,0)) # 获取对应城市的代码 def sSelectCity(self, event): sCity = event.GetEventObject().GetLabel() sscid = sCityDictionary.get(sCity,'101190101')#通过字典查找 print(sCity+" "+sscid) self.getWeather(sscid) def OnClicked(self, event): self.sSelectCity(event) app = wx.App() Mywin(None, 'wxPython 天气预报') app.MainLoop()
运行结果