使用正则表达式和urllib模块爬取最好大学排名信息

题目

使用urllib模块编程实现爬取网站的大学排名。
(网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html)
(1)获取网站页面,分析代码结构特征;
(2)处理页面,提取相关信息;
(3)解析数据,输出结果。

代码实现

Python3

import urllib.request
import re

# 获取指定url的源码信息
def getHTMLText(url):
    try:
        response = urllib.request.urlopen(url, timeout=30)
        html = response.read().decode('utf-8')
        return html
    except:
        return "access the web error!"
    return ""

# 根据具体结构匹配需要的排名信息,最终以列表的形式返回
def fullTextToSchoolList(html):
    # 正则匹配所有学校名称
    reg2 = r'<td><div align="left">(.*?)</div></td>'
    # 匹配排名信息
    reg = r'<td>(.*?)</td>'
    reg = re.compile(reg)
    reg2 = re.compile(reg2)
    ulists=re.findall(reg,html)
    unames=re.findall(reg2,html)
    # 将学校名称替换到一个list中
    i=1
    j=0
    while i < len(ulists):
        ulists[i]=unames[j]
        j=j+1
        i=i+4
    # 返回学校排名信息的列表
    return ulists

# 格式化输出结果
def printSchoolList(ulist):
    print("{:^9}\t{:^13}\t{:^10}\t{:^6}".format("排名", "学校名称","省市","总分"))
    print('========================================================================')
    i=0
    while i < len(ulist):
        rank = ulist[i] # 排名
        uname = ulist[i+1] # 学校名
        city = ulist[i+2] # 所在城市
        totalScore = ulist[i+3] # 总评分
        print("{:^10}\t{:^13}\t{:^10}\t{:^6}".format(rank, uname, city,totalScore)) # 格式化输出
        i=i+4

# main函数
def main():
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
   
    html = getHTMLText(url)
    ulist = fullTextToSchoolList(html)
    printSchoolList(ulist)
# 执行main函数
if __name__ == '__main__':
    main()

执行结果

在这里插入图片描述
其实使用BeautifulSoup模块实现起来更简单,更容易定位排名信息并获取指定标签体的内容。

另一种使用BeautifulSoup库爬取排名

url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"URL变成了2019的。这个最后爬取的内容和上面的一个是不同的。

代码实现

"""
定向爬取最好大学计算机展业排名信息,并输出到控制台
1. getHTMLText(url)
2. fullTextToSchoolList
3. printSchoolList
"""
from bs4 import BeautifulSoup
import requests
import bs4

def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        # 注意编码方式
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return "access the web error!"
    return ""

# 将提取后的结果追加到ulist列表中去
def fullTextToSchoolList(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td')
            try:
                td0 = tds[0].string
                td2 = tds[2].string
                td3 = tds[3].string
                ulist.append([td0,td2,td3])
            except:
                pass


def printSchoolList(ulist,num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名","百分段","学校名称"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^13}\t{:^10}".format(u[0], u[1], u[2]))


def main():
    uinfo = []
    url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"
    html = getHTMLText(url)
    fullTextToSchoolList(uinfo,html)
    printSchoolList(uinfo,20) # 只输出前20学校

if __name__ == '__main__':
    main()

输出结果
在这里插入图片描述

以上有错误的地方,欢迎评论指出!!!

posted @ 2020-05-23 16:59  起个名字都这么男  阅读(269)  评论(0编辑  收藏  举报