# 需求 爬取全国所有城市名称,已经对应的气温
# 分析其他区域的url规律
# 华东 http://www.weather.com.cn/textFC/hd.shtml
# 华北 http://www.weather.com.cn/textFC/hb.shtml
# 先搞定华北地区
import requests
from bs4 import BeautifulSoup
# 定义一个函数来解析网页
def parse_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400'
}
response = requests.get(url,headers=headers)
# 解决乱码
text = response.content.decode('utf-8')
soup = BeautifulSoup(text,'html5lib') # html5lib 解析能力更强,网页错乱啊,标签不全啊 用来更好的塑造源码结构 与lxml可以替换
# 网页解析
# 1.先拿到class="conMidtab"
conMidtab = soup.find('div',class_ = 'conMidtab')
# print(conMidtab)
# 2.拿到table
tables = conMidtab.find_all('table')
# print(tables)
# 3.找到tr过滤掉前两个
for table in tables:
# print(table)
# 过滤掉前两个tr
trs = table.find_all('tr')[2:]
# enumerate会返回两个值,一个是下标,二是下标所对的元素
for index,tr in enumerate(trs):
# print(tr)
# 4.找到td
tds = tr.find_all('td')
# 判断
city_td = tds[0] # 城市
if index == 0:
city_td = tds[1] # 取省会
# print(city_td) # 打印城区
# 获取一个标签下面的子孙节点的文本信息
city = list(city_td.stripped_strings)[0]
# 获取温度标签
temp_td = tds[-2]
# 获取温度标签下的文本
temp = list(temp_td.stripped_strings)[0]
print('城市:',city,'温度:',temp)
# break # 先打印北京
# 4.找到td
# print(text)
def main():
url = 'http://www.weather.com.cn/textFC/hb.shtml' # 华北
# url = 'http://www.weather.com.cn/textFC/db.shtml' # 东北
url = 'http://www.weather.com.cn/textFC/gat.shtml' #港澳台
urls = ['http://www.weather.com.cn/textFC/hb.shtml','http://www.weather.com.cn/textFC/db.shtml','http://www.weather.com.cn/textFC/gat.shtml']
for url in urls:
# 调用解析函数
parse_page(url)
if __name__ == '__main__':
main()
结果
城市: 北京 温度: 19
城市: 海淀 温度: 18
城市: 朝阳 温度: 20
城市: 顺义 温度: 18
城市: 怀柔 温度: 17
城市: 通州 温度: 18
城市: 昌平 温度: 18
城市: 延庆 温度: 14
城市: 丰台 温度: 19
城市: 石景山 温度: 18
城市: 大兴 温度: 18
城市: 房山 温度: 18
城市: 密云 温度: 16
城市: 门头沟 温度: 19
城市: 平谷 温度: 17
城市: 东城 温度: 20
城市: 西城 温度: 18
城市: 天津 温度: 21
城市: 武清 温度: 20
城市: 宝坻 温度: 18
城市: 东丽 温度: 20
城市: 西青 温度: 20
城市: 北辰 温度: 19
城市: 宁河 温度: 19
城市: 和平 温度: 21
城市: 静海 温度: 20
城市: 津南 温度: 20
城市: 滨海新区 温度: 20
城市: 河东 温度: 21
城市: 河西 温度: 21
城市: 蓟州 温度: 18
城市: 南开 温度: 21
城市: 河北 温度: 21
城市: 红桥 温度: 21
城市: 石家庄 温度: 19
城市: 保定 温度: 16
城市: 张家口 温度: 11
城市: 承德 温度: 12
城市: 唐山 温度: 16
城市: 廊坊 温度: 18
城市: 沧州 温度: 17
城市: 衡水 温度: 18
城市: 邢台 温度: 19
城市: 邯郸 温度: 18
城市: 秦皇岛 温度: 16
城市: 雄安新区 温度: 17
城市: 太原 温度: 9
城市: 大同 温度: 5
城市: 阳泉 温度: 13
城市: 晋中 温度: 12
城市: 长治 温度: 12
城市: 晋城 温度: 15
城市: 临汾 温度: 15
城市: 运城 温度: 15
城市: 朔州 温度: 6
城市: 忻州 温度: 9
城市: 吕梁 温度: 11
城市: 呼和浩特 温度: 8
城市: 包头 温度: 8
城市: 乌海 温度: 11
城市: 乌兰察布 温度: 7
城市: 通辽 温度: 16
城市: 赤峰 温度: 13
城市: 鄂尔多斯 温度: 10
城市: 巴彦淖尔 温度: 9
城市: 锡林郭勒 温度: 9
城市: 呼伦贝尔 温度: 7
城市: 兴安盟 温度: 14
城市: 阿拉善盟 温度: 12
城市: 哈尔滨 温度: 17
城市: 齐齐哈尔 温度: 15
城市: 牡丹江 温度: 18
城市: 佳木斯 温度: 18
城市: 绥化 温度: 17
城市: 黑河 温度: 12
城市: 大兴安岭 温度: 8
城市: 伊春 温度: 15
城市: 大庆 温度: 16
城市: 七台河 温度: 18
城市: 鸡西 温度: 18
城市: 鹤岗 温度: 17
城市: 双鸭山 温度: 18
城市: 长春 温度: 18
城市: 吉林 温度: 16
城市: 延边 温度: 18
城市: 四平 温度: 18
城市: 通化 温度: 17
城市: 白城 温度: 16
城市: 辽源 温度: 19
城市: 松原 温度: 17
城市: 白山 温度: 16
城市: 沈阳 温度: 16
城市: 大连 温度: 21
城市: 鞍山 温度: 17
城市: 抚顺 温度: 16
城市: 本溪 温度: 14
城市: 丹东 温度: 19
城市: 锦州 温度: 19
城市: 营口 温度: 18
城市: 阜新 温度: 16
城市: 辽阳 温度: 16
城市: 铁岭 温度: 16
城市: 朝阳 温度: 16
城市: 盘锦 温度: 18
城市: 葫芦岛 温度: 18
城市: 香港 温度: 28
城市: 澳门 温度: 27
城市: 台北 温度: 25
城市: 高雄 温度: 27
城市: 台中 温度: 22