使用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()

运行结果

使用BeautifulSoup抓取天气预报信息并通过wxPython可视化显示