《python网络爬虫和信息提取》:中国大学排名(附更改后的代码)

《python网络爬虫和信息提取》是北京理工大学的一门网络课程(中国大学MOOC(慕课))。

 《python网络爬虫和信息提取》:中国大学排名(附更改后的代码)_第1张图片

 偶然机会我在网上学习了这门课程,中国大学排名是老师在课程里举的一个例子。作为一个认真学习的python菜鸟,我把老师的代码认真敲打出来,一运行却出现问题。

 《python网络爬虫和信息提取》:中国大学排名(附更改后的代码)_第2张图片

是老师的代码有问题么?我把网址输入浏览器,却打不开,搜索了一下,发现几年后的今天,原网站进行了升级,从域名到网站结构,都发生了翻天覆地的变化,原代码当然不适用了。但在网上搜索,还能看到原封不动照搬老师代码的所谓学习心得,误人不浅,故把自己真正的学习心得放到这里,供和我一样的菜鸟参考。

    首先打开网页对应清华大学排名源代码部分,对相关标签进行分析。

《python网络爬虫和信息提取》:中国大学排名(附更改后的代码)_第3张图片

经过分析发现,名次1是tds[0],校名“清华大学”却并不是单独的tds[1],而是和英文校名、双一流/211一起,都属tds[1],在原代码tds[1].string基础上修改为:

tds[1]("a")[0].string,tds[1]("a")[1].string,tds[1]("p")[0].string,分别提取出了校名、英文校名、双一流/211等信息,但不知为什么,用tds[2].string,tds[3].string没能正常提取出省市(北京)、类别(综合)的信息,仍显示为None,用tds[4].string可以正常提取总分(999.4)信息。请高手们指正。(昨天文章在博客发表后,今天继续研究解决办法在网上搜索,就看到有人转载。)今天搜索到一篇文章,好像是真神下场在为自己的代码进行修改,也让我学到了解决之道。就是将string换成text即可,大神就是大神,不得不摩拜。

    修改后的代码为:

import requests
import bs4
from bs4 import BeautifulSoup

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        # print(r.request.url)
        r.encoding = r.apparent_encoding
        # print(r.text[:1000])
        return r.text
    except:
        # return ""
        print('网页抓取失败!')

def fillUnivList(ulist,html):
    soup = BeautifulSoup(html, "html.parser")
    # print('title=',soup.title)
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td') # 列表形式
            # print('tds=',tds)
            ulist.append([tds[0].string.strip(),tds[1]('a')[0].string.strip(),tds[1]('a')[1].string.strip(),
                          tds[1]('p')[0].string.strip(),tds[2].text.strip(),tds[3].text.strip(),
                          tds[4].text.strip()]) # 加('a')[0]解决None问题,OK
            # print('title=', soup.title)
            # print('省市=',tds[2].text)
            # print('校名2=', tds[1]('a')[0].string)
    # print('ulist=',ulist)

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{7}^10}\t{2:<45}\t{3:{7}^16}\t{4:^8}\t{5:^8}\t{6:^6}"
    # tplt = "{:^10}\t{:^6}\t{:^10}"
    print(tplt.format("排名", "学校名称", "英文名","是否双一流985/211","所属省市","学校类型","总分", chr(12288)))
    # print('%s\t\t%s\t\t%s' %("排名","学校名称","总分"))

    for i in range(num):
        u = ulist[i]
        # print('%s\t\t%s\t\t%s' %(u[0].strip('\n '),u[1],u[4].strip('\n '))) # 删除左边的空格
        print(tplt.format(u[0],u[1],u[2],u[3],u[4],u[5],u[6], chr(12288)))

def main():
    url = 'https://www.shanghairanking.cn/rankings/bcur/2022.html'
    uinfo = []
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,20) # 20 univs

main()

修改后的代码运行结果如下:

《python网络爬虫和信息提取》:中国大学排名(附更改后的代码)_第4张图片

 再次感谢大神!!!

你可能感兴趣的:(菜鸟学python,python,爬虫,开发语言)