学习视频:
https://www.bilibili.com/video/av96849338?p=39
欢迎留言批评指出错误。
方法与思路:
应用模块:
requests:发送请求,获取响应
beautifulsoup4:从 HTML 或 XML 文件中提取数据的 Python 库.
pyecharts:生成我们需求的柱状图
安装方式示例:pip install beautifulsoup4
数据提取方式:
采用beautifulsoup库提取信息。
find与find_all的区别:
find:提取子节点下的第一个标签。
find_all:提取子孙节点上所有满足要求的标签,以列表的形式输出。
strings和stripped_strings、string属性以及get_text方法:
string:获取某个标签下的非标签字符串,返回来的是个字符串。
strings:获取某个标签下的子孙非标签字符串,返回来的是个生成器。
stripped_strings:获取某个标签下的子孙非标签字符串,会去掉空白字符,返回来的是个生成器。
get_text:获取某个标签下的子孙非标签字符串,不是以列表的形式返回,是以普通字符串的形式返回。
网页分析:
观察知全国共分为华北、东北等8个地区,每个地区的网页url不同:
urls = {
‘http://www.weather.com.cn/textFC/hb.shtml’,
‘http://www.weather.com.cn/textFC/db.shtml’,
‘http://www.weather.com.cn/textFC/hd.shtml’,
‘http://www.weather.com.cn/textFC/hz.shtml’,
‘http://www.weather.com.cn/textFC/hn.shtml’,
‘http://www.weather.com.cn/textFC/xb.shtml’,
‘http://www.weather.com.cn/textFC/xn.shtml’,
‘http://www.weather.com.cn/textFC/gat.shtml’
}
下面我们取一个url为例,比如华北地区,检查网页源码分析得:
因此,我们需要提取的城市tr标签应为:
trs = table.find_all(‘tr’)[2:]
再次观察发现,北京对应的tr标签下有9个td标签,而海淀等后方城市只有8个td标签,总结得出第一个td标签对应的是省、直辖市,所以后方提取时,我们采用倒数的方法:
city_td = tds[-8]
temp_td = tds[-5]
这样就可避免匹配错误
如此重复便可获取所有城市以及对应的温度信息,将其封装在ALL_DATA信息中,值得一说的是,港澳台地区的网页源码并不规范,其原代码中
并不完整,缺少‘/table’,但是检查时发现源码补齐了/table,这是因为后台渲染解析时是采用html5lib的解析方式,容错能力强。若使用:text = response.content.decode(‘utf-8’)
soup = BeautifulSoup(text, ‘lxml’)
会产生错误,虽然lxml的解析速度快,但是容错能力不如html5lib,解析华北等地区并无影响,但对于港澳台这编写不规范时容易出错,所以全部采用html5lib的解析方式。
text = response.content.decode(‘utf-8’)
soup = BeautifulSoup(text, ‘html5lib’)