逻辑过程:
1.通过requests对网页进行爬取,返回网页html
2.通过bs4对网页数据进行解析,返回列表数据
3.格式化输出数据
函数式编程:
定义获取html数据函数,判断响应情况,返回网页resopense.text
定义解析函数:通过对数据函数返回内容进行解析,返回解析后的数据
定义展示函数:打印输出函数
定义运行函数:调用其他函数进行运行
亮点:
将所有数据解析放入一个列表中,在展示时,通过设定长度遍历解析数据所在列表,进行控制读取数据
问题及相关需要注意点:
soup.find('标签名').children:需要注意这里是否成功get了网页text,未成功可能会报错
soup.标签.string:当标签中有多个子标签时,会返回None,使用soup.标签.text;也可以find对应子标签然后获得string
https://blog.csdn.net/lin252931/article/details/105403723
string依旧存在问题,可能打印出来不能完全对齐,暂未找到解决方式
python代码实现:
由于本地不好使用爬虫,因此通过open读取网页的形式进行爬取
#中国大学排名定向爬虫
import requests
from bs4 import BeautifulSoup
import bs4
def getHtmltext(url):
try:
res=requests.get(url,timeout=30)
res.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return " "
def open_html(name):
with open(name,'rb')as f:
html=f.read()
return html
def fillUnivList(urlist,html):
#提取数据
soup=BeautifulSoup(html,'html.parser')
for tr in soup.tbody.children:
#获取tbody标签所有子节点tr标签
if isinstance(tr,bs4.element.Tag):
#判断获得所有满足条件的标签
tds=tr('td')
#快速获取tr标签中的所有tds标签
urlist.append([tds[0].string,tds[1].text,tds[2].text])
cont=tds[1].find('a')
# 快速获取tr标签中的所有tds标签
urlist.append([tds[0].string.replace(' ', '').replace(' ', ''),cont.string.replace(' ', '').replace(' ', ''), tds[2].string.replace(' ', '').replace(' ', '')])
#格式化输出比较常用print函数的formate格式化字符串
def printUnivlist(urlist,num):
print("{0} {1} {2}".format('排名','学校','地区'))
for i in range(num):
u=urlist[i]
print("{0} {1} {2}".format(u[0],u[1],u[2]))
def main():
uinfo=[]
#url='view-source:http://www.shanghairanking.cn/rankings/bcur/2020'
#html=getHtmltext(url)
html=open_html('大学排名.html')
fillUnivList(uinfo,html)
printUnivlist(uinfo,20)#20 univs
main()