学习视频:
视频链接
欢迎留言指出错误。
方法与思路:
应用模块:
requests:发送请求,获取响应
beautifulsoup4:从 HTML 或 XML 文件中提取数据的 Python 库.
数据提取方式:
采用beautifulsoup库提取信息。
网页分析:
链接:中国最好大学排名2019
代码如下:
# encoding: utf-8
# time: 2020/3/22 16:44
# 说明:
from bs4 import BeautifulSoup
import bs4
import requests
#输入是获取URL信息,输出是URL内容
def gethtmltxt(url):
# 检测是否异常
try:
# get函数获取URL信息,并设定timeout时间为30秒
r = requests.get(url, timeout=30)
# print(r.status_code)可查询状态码,返回200
# 如果发送了一个错误请求(一个4XX客户端错误,或者5XX服务器错误响应),
# 我们可以通过Response.raise_for_status()来抛出异常
r.raise_for_status()
#print(r.encoding)可查看网页的编码方式,此网站为ISO-8859-1,
# r.apparent_encoding从内容中分析出的响应内容编码方式
r.encoding = r.apparent_encoding
# r.text:http响应内容的字符串形式,即url的页面内容
# 将网页的信息内容返回给其他部分
return (r.text)
# 如果异常则返回一个空字符
except:
return ""
#将HTML页面放到一个空列表中,列表名称定义为ulist
def culi(ulist, html):
soup = BeautifulSoup(html, "html.parser")
# 用for语句查找HTML中的tbody标签,并将它的孩子children做一个遍历,变量中每一个tr对应一所大学信息
for tr in soup.find("tbody").children:
# 检测tr标签的类型,如果不是bs4库定义的Tag类型将过滤掉
if isinstance(tr, bs4.element.Tag):
# 将tr标签中的td标签存为一个列表类型tds,tr('td')相当于tr.find_all("td")
tds = tr("td")
# 在ulist中增加所需字段,分别对应大学排名,大学名称,大学地域
ulist.append([tds[0].string, tds[1].string, tds[2].string])
#将ulist中的信息打印出来,num表示需要将列表中多少个选项或元素打印出来
def printhanshu(ulist, num):
# 设置表头宽度
a = "{0:^10}{1:{3}^10}{2:^10}"
# 实现对表头的打印,{}表示槽,10表示取十位间隔,^表示居中,chr((12288)表示中文空格
print(a.format("排名", "学校", "地域", chr(12288)))
for i in range(num):
# 将第i个学校的信息作为一个简短的变量u来代替
u = ulist[i]
# 打印出每一所学校的信息
print(a.format(u[0], u[1], u[2], chr(12288)))
#主函数
def main():
# 将大学信息放到一个列表中,列表名叫unifo
unifo = []
# 给出大学排名的url链接
url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html"
# 将URL转换成HTML
html = gethtmltxt(url)
# 将HTML的信息提取后放在unifo变量中
culi(unifo, html)
# 打印20所学校信息
printhanshu(unifo, 20)
main()