-
需求分析:爬取全中国所有城市以及对应的温度
-
用到的知识点:
a: BeautifulSoup 、html5lib、lxml
b:安装:1.pip install lxml
2.pip install bs4
3.pip install html5lib -
分析网页:
-
解析网页,一层一层拿取数据标签,先获取conMidtab
-
难点在于直辖市和省份的问题,可通过判断下标索引值来取第1个值:
-
港澳台页面源码的问题:可用‘html5lib’替换‘lxml’,两者的功能对比自行百度
# 需求:爬取全中国所有城市以及对应的温度
# 第一个 分析页面结构
# 第二个 直辖市和省份问题 通过判断下标索引值来取第1个值
# 第三个 网页标签问题 soup = BeautifulSoup(text,'html5lib')
import requests
from bs4 import BeautifulSoup
def parse_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
response = requests.get(url, headers=headers)
# print(response.content.decode('utf-8'))
html = response.content.decode('utf-8')
# 解析网页,一层一层拿取数据标签
# 先获取conMidtab 这个div标签 pip install html5lib
soup = BeautifulSoup(html, 'html5lib') # 对比‘lxml’--'html5lib'
conMidtab = soup.find('div', class_ = 'conMidtab')
# 找到所有的table标签
tables = conMidtab.find_all('table')
# 遍历
for table in tables:
# 找到所有tr标签,过滤掉前2个
trs = table.find_all('tr')[2:]
# enumerate(trs) 返回2个值 第一个是下标索引 第二个是下标索引所 对应的值
for index,tr in enumerate(trs):
# 找td标签里面的城市和对应温度
tds = tr.find_all('td')
city_td = tds[0]
# 解决直辖市和省份问题 通过判断下标索引值来取第1个值
if index == 0:
city_td = tds[1] # 直辖市也OK 省会更OK
temp_td = tds[-2]
city = list(city_td.stripped_strings)[0] # 城市
temp = list(temp_td.stripped_strings)[0] # 温度
print('城市:',city,'温度:',temp)
# print(city_td)
def main():
# url = 'http://www.weather.com.cn/textFC/gat.shtml'
# url = 'http://www.weather.com.cn/textFC/hb.shtml'
# kw = input('请输入城市缩写:')
# baseurl = 'http://www.weather.com.cn/textFC/kw.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()