学习北京理工大学:嵩天老师的教程,这是第一次作业,因为练习的少,很多提取信息的方法已经遗忘。要多多练习,否则学习没有用武之地,就像大厨的刀具变钝,最后上菜味道难以入口。
定位到每所大学的td class ='align-left’的信息。通过平行标签来获取信息,排名是平行上标签,地区是平行下标签,类型是平行标签下行的下行标签。大学是该td下的a标签文本。
这里就不定义那么多的方法了,直接爬取:
import requests
import bs4
from bs4 import BeautifulSoup
headers = {'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36'}
resp = requests.get('http://www.shanghairanking.cn/rankings/bcur/2020')
# ~ resp.encoding = resp.apparent_encoding #这也可以解析中文字符
text = resp.content.decode('utf-8')
soup = BeautifulSoup(text,'html.parser')
tds = soup.find_all('td',class_='align-left') #找到所有td标签
ranking = []
for td in tds:
sc = td('a')[0] #sc = td.find('a')也可以这样表示
province = td.next_sibling.string.strip() #平行标签的下标签
score = td.next_sibling.next_sibling.next_sibling.string.strip()
college = sc.string
rank = td.previous_sibling.string.strip() #平行标签的上标签
dict_rank ={'rank':rank,'college':college,'province':province,'score':score}
ranking.append(dict_rank)
print(ranking)
这样写如果一个tr下td有非常多个,平行标签找起来就会变成.next_sibling.next_sibling.next_sibling.next_sibling.next_sibling.next_sibling… 非常的冗长。
所以换一种方式:
import requests
from bs4 import BeautifulSoup
headers = {'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36'}
resp = requests.get('http://www.shanghairanking.cn/rankings/bcur/2020')
text = resp.content.decode('utf-8')
soup = BeautifulSoup(text,'html.parser')
table = soup.find('table',class_='rk-table') #_在class后
tbody =table.find('tbody')
trs=tbody.find_all('tr') #等于trs=tbody('tr')
uni_list = []
for tr in trs:
td =tr.find_all('td')#等于td=tr('td')
rank = td[0].string.strip()
college = td[1].find('a').string
province = td[2].string.strip()
uni_type = td[3].string.strip()
score = td[4].string.strip()
level = td[5].string.strip()
uni_list.append([rank,college,province,uni_type,score,level]) #一定要以列表或字典的形式添加
#uni_list的结果是列表中的列表:[[一所大学信息], [一所大学信息],....,[一所大学信息], [一所大学信息]]
num = len(uni_list)#计算大学的个数
print("{:^10}\t{:^2}\t{:^6}\t{:^10}\t{:^10}\t{:^10}".format("排名","学校名称","省份","类型","分数","层次"))
for i in range(num): #遍历所有大学
u=(uni_list)[i] #按顺序取出大学信息的列表
print("{:^10}\t{:^2}\t{:^6}\t{:^10}\t{:^10}\t{:10}".format(u[0],u[1],u[2],u[3],u[4],u[5]))
#: 引导符号,^表示变量的文字居中,10表示这里占用10个空格宽度,也就是槽的设定输出宽度,\t表示空格
打印的结果在七个汉字内的大学名就不会错位,如哈尔滨工程大学。(网站信息不提供超过100名后的层次分数。)
中英文字符占用的空间不同,空格宽度修改再大,还是会有错位。采用中文字符的空格填充chr(12288)。空白位置用序号{1}的内容填充。从错位开始的大学名称中插入空格以对齐。tplt.format(“排名”,“学校名称”,“省份”,“类型”,“分数”,“层次”,chr(12288))),{0}是排名,{1}是学校名称,{2}是省,{3}是类型,{4}是分数,{5}是层次,{6}是一个全角空格字符参数
format插入数据,{1:{6}^14}中间的{6}即为以format函数最后的chr(12288)参数为分隔距离,表示以一个汉字大小的距离。
import requests
from bs4 import BeautifulSoup
headers = {'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36'}
resp = requests.get('http://www.shanghairanking.cn/rankings/bcur/2020')
text = resp.content.decode('utf-8')
soup = BeautifulSoup(text,'html.parser')
table = soup.find('table',class_='rk-table') #_在class后
tbody =table.find('tbody')
trs=tbody.find_all('tr') #等于trs=tbody('tr')
uni_list = [["排名","学校名称","省份","类型","分数","层次"]]
for tr in trs:
td =tr.find_all('td')#等于td=tr('td')
rank = td[0].string.strip()
college = td[1].find('a').string
province = td[2].string.strip()
uni_type = td[3].string.strip()
score = td[4].string.strip()
level = td[5].string.strip()
uni_list.append([rank,college,province,uni_type,score,level])
num = len(uni_list)
for i in range(num):
u=(uni_list)[i]
print('{0:^10}\t{1:{6}^14}\t{2:^10}\t{3:^10}\t{4:<10}\t{5:<10}\t{6:<10}'.format(u[0],u[1],u[2],u[3],u[4],u[5],chr(12288)))
排名 学校名称 省份 类型 分数 层次
1 清华大学 北京 综合 852.5 38.2
2 北京大学 北京 综合 746.7 36.1
3 浙江大学 浙江 综合 649.2 33.9
4 上海交通大学 上海 综合 625.9 35.4
5 南京大学 江苏 综合 566.1 35.1
6 复旦大学 上海 综合 556.7 36.6
7 中国科学技术大学 安徽 理工 526.4 40.0
8 华中科技大学 湖北 综合 497.7 31.9
9 武汉大学 湖北 综合 488 31.7
10 中山大学 广东 综合 457.2 30.3
11 西安交通大学 陕西 综合 452.5 34.3
12 哈尔滨工业大学 黑龙江 理工 450.2 32.7
13 北京航空航天大学 北京 理工 445.1 32.8
14 北京师范大学 北京 师范 440.9 34.8
15 同济大学 上海 理工 439 33.4
16 四川大学 四川 综合 435.7 32.5
17 东南大学 江苏 综合 432.7 33.7
18 中国人民大学 北京 综合 409.7 34.5
19 南开大学 天津 综合 402.1 32.4
20 北京理工大学 北京 理工 395.6 31.9
21 天津大学 天津 理工 390.3 32.6
22 山东大学 山东 综合 387.9 28.8
23 厦门大学 福建 综合 383.3 32.7
24 吉林大学 吉林 综合 379.5 29.9
25 华南理工大学 广东 理工 379.4 30.4
26 中南大学 湖南 综合 378.6 30.6
27 大连理工大学 辽宁 理工 365.1 30.1
28 西北工业大学 陕西 理工 359.6 32.5
29 华东师范大学 上海 师范 358 32.6
30 中国农业大学 北京 农业 351.5 30.9
31 湖南大学 湖南 综合 348.3 31.5
32 电子科技大学 四川 理工 334.8 30.5
33 北京科技大学 北京 理工 321.8 31.4
34 重庆大学 重庆 综合 320.9 30.2
35 南京航空航天大学 江苏 理工 319.5 29.2
36 南京理工大学 江苏 理工 317.1 30.9
37 东北大学 辽宁 理工 314 31.7
38 苏州大学 江苏 综合 306.8 29.0
39 华中农业大学 湖北 农业 300.5 27.9
40 兰州大学 甘肃 综合 300.4 30.5
41 西安电子科技大学 陕西 理工 299.4 29.8
42 华东理工大学 上海 理工 294.6 29.8
43 北京交通大学 北京 理工 293.6 31.5
44 华中师范大学 湖北 师范 292.4 30.2
45 上海大学 上海 综合 290 31.2
46 南方科技大学 广东 综合 289 26.7
47 南京农业大学 江苏 农业 283.2 29.0
48 暨南大学 广东 综合 282.6 27.9
49 中国海洋大学 山东 综合 281.2 30.2