BeautifulSoup库中信息提取的实例

对最好中国大学排名网站进行信息的提取,提取当中的前20条信息:
在这里插入图片描述
代码实现

import requests                 #首先引入requests库和BeautifulSoup库
from bs4 import  BeautifulSoup
import  bs4

#定义三个函数分别对应三个步骤,将三个函数写进来import requests
#首先定义三个函数,然后分别定义他们的接口
def getHTMLText(url):            #输入获取的url信息,输出是url的内容
    try:
        r = requests.get(url,timeout = 30)#get获取url信息,并且设置时间是30秒
        r.raise_for_status()             #用raise_for_status产生异常信息
        r.encoding = r.apparent_encoding   #修改编码
        return r.text                 #将网页的内容返回给程序的其他部分
    except:
        return ""                   #出现错误,则返回空字符串

def fillUnivList(ulist,html):               #将一个HTML页面中的关键数据添放到list列表中(最核心的部分),要使用BeautifulSoup库
     soup = BeautifulSoup(html,"html.parser")        #用BeautifulSoup类来“煲汤”,采用html的解析器
     #观察要爬取的网页源代码,发现所有的大学信息被封装在一个表格中,表格的标签叫  tbody,
     # 在tbody中,每个大学的信息又被封装在一个标签中,这个标签叫tr,即每一个tr标签包含了所有大学的信息
     #每个tr标签的信息又被td包围
     #所以要在整个HTML中,首先找到tbody标签,获取所有大学的相关信息 ;然后在tbody标签中解析tr标签,获得每一个大学信息;再把tr标签的td标签找到,把每一个大学的相关参数写到ulist 列表中(用遍历以及查找方法获得)
     for tr in soup.find('tbody').children:   #for语句查找tbody标签,并且将孩子children遍历
         if isinstance(tr,bs4.element.Tag):     #isinstance对函数进行判断,检测tr标签的类型,如果tr不是bs4定义的Tag类型,将过滤掉(并且为了代码可以运行需要引入一个新的类型bs4)
            tds = tr('td')               #将所有的td 标签存为一个列表类型tds  ,
            ulist.append([tds[0].string,tds[1].string,tds[3].string])                #在ulist中增加对应的字段,分别是大学排名、大学名称、大学评分
'''pass首先解析HTML代码中tbody标签所在的位置,在tbody标签中找到每一所大学对应上午tr 标签,在tr 标签中找到td标签的信息,并把需要的td 标签添加到列表中,
'''
'''下面是实现打印大学列表的相关功能
    需要用到格式化输出《格式化输出的方法》
'''
def printUnivList(ulist,num):     #将ulist信息打印出来
    print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))#print 函数实现对表头的打印,下面实现对其他信息的打印
    for i in range(num):
        u = ulist [i]
        '''所有的信息保存在ulist中,想要输出的学校数量由num控制用for循环实现'''
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
        #将第i个学校的信息,作为一个简单的变量u来代替,然后将每一所学校的信息打印出来
        #注意:为了保证输出的效果,需要使用和表头相一致的支付串表示
#     print("Suc"+str(num))   #num表示到打印出来的学校的个数
# #定义好三个函数之后要写主函数,主函数约定使用main


def main():
    uinfo=[]
    url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,20)                                     #打印大学信息,20个学校(univs)

main()

运行结果:
在这里插入图片描述
从中发现,中间列当中的中文没有很好的对齐,不美观,因为我们居中是其余没有用到的中文空格都是用英文填充的,为了解决居中的问题,应该讲空格部分用中文的方式填充,这里就要使用到chr(12288)这个方法。

代码的优化,主要替换上述中的printUnivList方法:

 def printUnivList(ulist, num):
     tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
     print(tplt.format("排名", "学校名称", "总分", chr(12288)))
     for i in range(num):
         u = ulist[i]
         print(tplt.format(u[0], u[1], u[2], chr(12288)))

在这里插入图片描述
哈哈,这样是不是美观很多了呢

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值