Répteis Songtianos da segunda semana, unidade 6, exemplo 1, notas reais de combate

Artigo de referência: rastreamento de classificação de universidade de melhor rede de universidade em Python (2020)

A segunda semana do MOOC Professor Songtian Python Web Crawler Unidade 6 da Universidade Chinesa da China Exemplo 1 A página da web de classificação da universidade rastreada mudou. O blog de Zhiyuan foi modificado com base no código original do professor e descobri que a página da web mudou novamente., Continue a modificar, forneça o último processo de rastreamento e código.

1. Análise da web

Link da Web: https://www.shanghairanking.cn/rankings/bcur/2020

Lugares que mudaram 1 (consulte o blog de Zhiyuan)

O hiperlink é adicionado ao nome da universidade, e o nome é envolvido na tag a sob a tag td. Preste atenção

Obtenha o nome da universidade

Lugares que mudaram 2

Na etiqueta td, existem linhas em branco na etiqueta td [0] que representa o número de série e na etiqueta td [4] que representa a pontuação.
Obtenha conteúdo de classificação
Se você usar diretamente

td[0].string

Como o objeto está vazio, o formato na função printUnivList relatará um erro:

TypeError: unsupported format string passed to NoneType.__format__

Portanto, as linhas em branco precisam ser removidas.
A primeira coisa que vem à mente é o método replace ():

tds[0].text.replace("\n", "")

Após a depuração, é realmente viável.

Depois de consultar a documentação do bs4, encontrei o método stripped_strings:

tds[0].stripped_strings

Dois, o código:

# -*- coding: utf-8 -*-
# Created on 2021/3/6 14:01

import requests
from bs4 import BeautifulSoup
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 ""


def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find_all('td')
            name = tds[1].find('a').string.strip()
            rank = tds[0].text.replace("\n", "").strip()
            score = tds[4].text.replace("\n", "").strip()
            ulist.append([rank, name, score])


# 打印列表内容
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].strip(), u[1].strip(), u[2].strip(), chr(12288)))

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


main()

Outra maneira de escrever fillUnivList:

# 通过BeautifulSoup库解析网页,将信息加入列表中
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find_all('td')
            tlist = []  # 创建临时列表
            for rank in tds[0].stripped_strings:  # 使用stripped_strings去掉换行、空格等
                tlist.append(rank)
                name = tds[1].find('a').string.strip()
                tlist.append(name)
                for score in tds[4].stripped_strings:
                    tlist.append(score)
        ulist.append([tlist[0], tlist[1], tlist[2]])  # 将临时列表元素填充到ulist

Resultado de saída:

   排名    	   学校名称   	    总分    
    1     	   清华大学   	  852.5   
    2     	   北京大学   	  746.7   
    3     	   浙江大学   	  649.2   
    4     	  上海交通大学  	  625.9   
    5     	   南京大学   	  566.1   
    6     	   复旦大学   	  556.7   
    7     	 中国科学技术大学 	  526.4   
    8     	  华中科技大学  	  497.7   
    9     	   武汉大学   	   488    
    10    	   中山大学   	  457.2   
    11    	  西安交通大学  	  452.5   
    12    	 哈尔滨工业大学  	  450.2   
    13    	 北京航空航天大学 	  445.1   
    14    	  北京师范大学  	  440.9   
    15    	   同济大学   	   439    
    16    	   四川大学   	  435.7   
    17    	   东南大学   	  432.7   
    18    	  中国人民大学  	  409.7   
    19    	   南开大学   	  402.1   
    20    	  北京理工大学  	  395.6

É isso, primeiro blog, críticas e orientações são bem vindas

Acho que você gosta

Origin blog.csdn.net/IGnusFaTuus/article/details/114440934
Recomendado
Clasificación