application:bs4+requests对网页数据进行解析

逻辑过程:

1.通过requests对网页进行爬取,返回网页html

2.通过bs4对网页数据进行解析,返回列表数据

3.格式化输出数据

函数式编程:

定义获取html数据函数,判断响应情况,返回网页resopense.text

定义解析函数:通过对数据函数返回内容进行解析,返回解析后的数据

定义展示函数:打印输出函数

定义运行函数:调用其他函数进行运行

亮点:

将所有数据解析放入一个列表中,在展示时,通过设定长度遍历解析数据所在列表,进行控制读取数据

问题及相关需要注意点:

soup.find('标签名').children:需要注意这里是否成功get了网页text,未成功可能会报错

soup.标签.string:当标签中有多个子标签时,会返回None,使用soup.标签.text;也可以find对应子标签然后获得string

https://blog.csdn.net/lin252931/article/details/105403723

string依旧存在问题,可能打印出来不能完全对齐,暂未找到解决方式

python代码实现:

由于本地不好使用爬虫,因此通过open读取网页的形式进行爬取

 

#中国大学排名定向爬虫
import requests
from bs4 import BeautifulSoup
import bs4
def getHtmltext(url):
    try:
        res=requests.get(url,timeout=30)
        res.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return " "
def open_html(name):
    with open(name,'rb')as f:
        html=f.read()
    
    return html

def fillUnivList(urlist,html):
    #提取数据
    soup=BeautifulSoup(html,'html.parser')
    for tr  in soup.tbody.children:
        #获取tbody标签所有子节点tr标签
        if isinstance(tr,bs4.element.Tag):
            #判断获得所有满足条件的标签
            
            tds=tr('td')
            
            #快速获取tr标签中的所有tds标签
            urlist.append([tds[0].string,tds[1].text,tds[2].text])
        

      
    
    cont=tds[1].find('a')
    # 快速获取tr标签中的所有tds标签
    urlist.append([tds[0].string.replace('\n', '').replace('\r', ''),cont.string.replace('\n', '').replace('\r', ''), tds[2].string.replace('\n', '').replace('\r', '')])

#格式化输出比较常用print函数的formate格式化字符串 def printUnivlist(urlist,num): print("{0}\t{1}\t{2}".format('排名','学校','地区')) for i in range(num): u=urlist[i] print("{0}\t{1}\t{2}".format(u[0],u[1],u[2])) def main(): uinfo=[] #url='view-source:http://www.shanghairanking.cn/rankings/bcur/2020' #html=getHtmltext(url) html=open_html('大学排名.html') fillUnivList(uinfo,html) printUnivlist(uinfo,20)#20 univs main()

 

posted @ 2020-10-13 14:07  yescarf  阅读(228)  评论(0编辑  收藏  举报