import re
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLTEXT(url):
try:
r = requests.get(url)
r.encoding = r.apparent_encoding
r.raise_for_status
return r.text
except:
return 'Error'
def fillUnivList(ulist,html):
soup = BeautifulSoup(html,'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr.find_all('td')
name = tr.find_all('span')
ulist.append([tds[0].string, name[0].string, tds[4].string])
def printUnivList(ulist,num):
print("{:^10} \t {:^10} \t {:^7}".format("排名","学校名称","总分"))
for i in range(num):
u = ulist[i]
print("{:^10} \t {:^10} \t {:^10}".format(u[0].strip(), u[1].strip(), u[2].strip() ))
def main():
uinfo = []
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLTEXT(url)
fillUnivList(uinfo,html)
printUnivList(uinfo, 20) # 20 univs
main()
中国最好大学网更新之后,排行的大学名字单独放进了和<td>标签平级的<span>里面,所以需要单独提取,而且由于输出时有空格,所以需要注意对字符串空格的去除。
总体思想:
先连接到网页,requests库的基本方法。
接着解析网页内容放入列表,for循环遍历提取子节点所有符合条件的标签,依次追加到ulist里面。
最后把ulist的内容借助循环遍历输出。
问题总结:
在做的过程中主要对列表的认识不够清晰,在追加时少加了【】,导致追加时“排行,名称,分数”变成了分开添加的,这是第一种错误。
其次是调用函数时打错了名字,导致列表没有正常添加,这是第二种错误。
然后格式化输出时没有意识到字符串空格问题,这是第三种错误。
目前程序已经没有问题,但对于ulist列表的生命周期依旧存疑,问题:为什么该函数中的局部变量未经返回即可被其他函数调用?