bs4库一般使用方法是find或者find_all方法(详细内容见上一篇博客)
find方法比较使用的是可以查找指定内容的数据,使用attrs={}来定制条件,代码中我用了attrs={'class':'conMidtab'}或者使用class_='conMidtab'
查看网页源代码可知
通过'class':'conMidtab'来定位到所需信息的表
再分析:因为有多个conMidtab,所以测试分析得知多个conMidtab对应的是今天,明天,后天......的天气情况
我们分析的是今天的情况,所以取第一个conMidtab,使用soup.find("div",class_="conMidtab")获取第一个conMidtab的内容
由上知:conMidtab下的多个class="conMidtab2"代表不同的省的天气信息
但是在研究可以发现,所有天气信息都是存储在table里的,因此获取所有tables即可——cons.find_all('table')
同时对于每一个table而言:第三个tr开始才是对应的城市信息,故对于每一个table获取trs = table.find_all("tr")[2:]
易错点:同时发现对于每个省第一个城市,它隐藏在tr的第二个td里,而除此之外的该省其他城市则在tr的第一个td里,因此使用一个if和else判断
enumerate方法可以产生一个index下标,因此在遍历trs的时候可以知道当index==0的时候是第一行
之后分析:城市名字:对于每个省第一个城市,它隐藏在tr的第二个td里,而除此之外的该省其他城市则在tr的第一个td里
最高气温:对于每个省第一个城市,它隐藏在tr的第五个td里,而除此之外的该省其他城市则在tr的第四个td里
因此使用
1
2
3
4
5
6
|
if index = = 0 : tds = tr.find_all( 'td' )[ 1 ] qiwen = tr.find_all( 'td' )[ 4 ] else : tds = tr.find_all( 'td' )[ 0 ] qiwen = tr.find_all( 'td' )[ 3 ]<br>最后使用stripped_strings获取字符串并且添加到data列表里<br><br><strong> 3. 进行所有城市的数据获取:<br>< / strong> |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def main(): 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" ] for url in urls: parse_data(url) |