结合bs4, 在flask应用中查询天气

网上好多查询天气的API接口,使用简单,页面还好看。
自己写一遍代码,会收获多一些。


暂时不考虑页面和查询结果的美观,大概如下。

结合bs4, 在flask应用中查询天气_第1张图片

结合bs4, 在flask应用中查询天气_第2张图片


上面的天气结果来自中国天气网:

结合bs4, 在flask应用中查询天气_第3张图片

对应的网页源代码:

<div class="t">
<div class="sk">
div>
<ul class="clearfix">
<li>
<h1>14日白天h1>
<big class="jpg80 d01">big>
<p class="wea" title="多云">多云p>
<p class="tem">
<span>34span><em>°Cem>
p>
<p class="win">
<i class="">i>
<span class="" title="无持续风向">微风span>
p>
<p class="sun sunUp"><i>i>
<span>日出 05:53span>
p>
<div class="slid">div>
li>
<li>
<h1>14日夜间h1>
<big class="jpg80 n01">big>
<p class="wea" title="多云">多云p>
<p class="tem">
<span>26span><em>°Cem>
p>
<p class="win"><i class="">i><span class="" title="无持续风向">微风span>p>
<p class="sun sunDown"><i>i>
<span>日落 18:13span>
p>
li>
ul>
div>

先用爬虫来抓取需要的数据。

首先,要根据输入城市名找到对应的城市ID。(用python中的字典,中国天气网提供了城市ID列表,使用Excel、记事本就可以批量完成)

写了一个单独的文件citycode.py:

结合bs4, 在flask应用中查询天气_第4张图片


然后,根据不同的城市,用不同的URL得到查询结果。

from urllib.request import urlopen
from bs4 import BeautifulSoup
from citycode import citycode

#写在了函数里,需要传递城市名参数
def get_weather(cityname):
    prefix = 'http://www.weather.com.cn/weather1d/'
    suffix = '.shtml'
    # 根据用户输入城市名找到对应的城市编码id
    city_id = citycode[cityname]

    #完整的URL
    url = prefix + str(city_id) + suffix

    htmldoc = urlopen(url)
    soup = BeautifulSoup(htmldoc,"html.parser")
    soup1 = soup.find('div','t')

    # 这是今天的天气信息
    result_almost = soup1.ul

    # 这样直接当最后结果,调用函数后返回这个结果
    result = result_almost.get_text()
    return result

然后在flask 应用中调用这个get_weather函数。

from flask import Flask, render_template,request
from flask_wtf import FlaskForm
from wtforms import StringField, validators
from weather import get_weather

app = Flask(__name__)


#使用了wtforms,虽然web form内容很少
class WeatherForm(FlaskForm):
    city = StringField('City', [validators.Length(min=0, max=10)])

@app.route("/weather",methods=['GET','POST'])
def weather():
    form = WeatherForm(request.form)
    if request.method == 'POST':
        city = form.city.data
        result = get_weather(city) # 调用get_weather函数来抓取天气信息,同时将结果传递到weather.html模板中。
        return render_template('weather.html',form=form,result=result)
    return render_template('weather.html',form=form)

if __name__ == '__main__':
    app.secret_key="It doesn't matter"
    app.run(debug=True)

然后,weather.html:


<html>
  <head>
    <meta charset="utf-8">
    <title>flaskapptitle>
  head>
  <body>
    <form method="POST",action="">
      {{ form.csrf_token }}
      {{form.city}}  
      <input type="submit" value="查询">
    form>
    <div>
      <h1>{{form.city.data}}h1>  
      <p>{{result}}p>  
    div>
  body>
html>

能改进的还有好多,先这样啊。

好想有份工作,结合着工作来学习。
不然学习成本太高了,而且这都毕业两个多月了,还没有工作,真的说不过去。

你可能感兴趣的:(学习,笔记)