Python入门学习记录03--用户管理系统+Xpath

Python入门学习记录03–用户管理系统+Xpath

1.完成用户管理系统

#实现五个基本功能
print("""
************************************
    |欢迎使用【学生信息管理系统】|
    |请选择你想要进行的操作      |
    |1.新建学生信息             |
    |2.显示全部信息             |
    |3. 查询学生信息             |
    |4. 删除学生信息             |
    |5.修改学生信息             |
    |0.退出系统                 |
************************************
 """)

str_print = "姓名:{}\t语文成绩:{}\t数学成绩:{}\t英语成绩{}\t总成绩:{}"
grade_list = []
while 1:
    action = input("请选择你想要进行的操作:")
    if action == '1':
    #新建学生信息
        Name = input('请输入名字:')
        Chinese = int(input('请输入语文成绩:'))
        Math = int(input('请输入数学成绩:'))
        English = int(input('请输入英语成绩:'))
        Total = Math+Chinese+English
        grade_list.append([Name,Chinese,Math,English,Total])
        print(grade_list)
        print(str_print.format(Name,Chinese,Math,English,Total))
        pass
    elif action =='2':
    #显示全部信息
        print('以下是全部信息:')
        for item in grade_list:
            print(str_print.format(*item))
        pass
    elif action =='3':
    #查询学生信息
        Name = input('请输入你需要查询学生的姓名:')
        for item in grade_list:
            if Name in item:
                print(str_print.format(*item))
                break
        else:
            print('此学生不存在')
        pass
    elif action =='4':
    #删除学生信息
        Name = input('请输入要删除的学生姓名:')
        for item in grade_list:
            if Name in item:
                item = grade_list.pop(grade_list.index(item))
                print('这个学员的信息已经被删除')
        pass
    elif action =='5':
    #修改学生信息
        Name = input('请输入要修改的学生姓名:')
        for item in grade_list:
            if Name in item:
                index = grade_list.index(item)
                break
                print('学员的信息修改成功')
        else:
            print('此学生不存在')
            continue
        Chinese = int(input('请输入语文成绩:'))
        Math = int(input('请输入数学成绩:'))
        English = int(input('请输入英语成绩:'))
        Total = Chinese+Math+English
        grade_list[index] = [Name,Math,Chinese,English,Total]
        pass
    elif action =='0':
    #退出系统
        break
    else:
        print('信息输入有误,重新输入')
        pass

2.使用urllib爬取三个不同的网页并且保存到本地

#代码   分别爬取新浪网,网易云音乐,Mooc三个页面
import urllib.request 

def getHTML(url):  
     html = urllib.request.urlopen(url).read()   
     return html
def saveHTML(file_name, file_content):  
     with open(file_name.replace('/', '_') + ".html", "wb") as f:  
            f.write(file_content) 

aurl1 = "https://mil.news.sina.com.cn/zhengming/2020-09-02/doc-iivhuipp2027816.shtml"
aurl2 = "https://music.163.com/?from=infinity"
aurl3 = "https://www.icourse163.org/"
html1 = getHTML(aurl1)
print("网页1已爬取")
html2 = getHTML(aurl2)
print("网页2已爬取")
html3 = getHTML(aurl3)
print("网页3已爬取")
saveHTML("Xin_Lang", html1)
print("网页1已存储至本地")
saveHTML("Wang_Yi_Yun", html2)
print("网页2已存储至本地")
saveHTML("Mooc", html3)
print("网页3已存储至本地")

3.熟悉Xpath语法,并且自己去找几个网页利用Xpath语法获取网页元素,并且将获取到的截图和Xpath语法保存提交

(1)Xpath语法自学笔记

'''
(1)nodename选中该元素。
/	从根节点选取、或者是元素和元素间的过渡。
//	从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。跨节点获取标签
.	选取当前节点。
..	选取当前节点的父节点。
@	选取属性。
text()	选取文本。
(2)通配符         描述
       *          匹配任何元素节点。
       @*         匹配任何属性节点。
    node()        匹配任何类型的节点。
    /div/         选取div元素的所有子元素。
    //*           选取文档中的所有元素。
    //title[@*]   选取所有带有属性的title元素。
'''
import parsel
'''网页片段'''
html_str = """
<div>
    <ul>
        <li class="item-1">
            <a href="link1.htm1 ">第一个</a>
        </1i>
        <li class="item-2">
            <a href="link2.html ">第二个</a>
        </1i>
        <li class="item-3">
            <a href="link3.html ">第三个</a>
        </1i>
        <li class="item-4">
            <a href="link4.html ">第四个</a>
        </1i>
        <li class="item-5">
            <a href="link5.htm1 ">第五个</a>
        </1i>
        <li class="item-6">
            <a href="link6.html ">第六个</a>
        </1i>
        <li class="item-7">
            <a href="link7.html ">第七个</a>
        </1i>
        <li class="item-8">
            <a href="link8.html ">第八个</a>
        </1i>
        <li class="item-9">
            <a href="link9.htm1 ">第九个</a>
        </1i>
        <li class="item-10">
            <a href="link10.html ">第十个</a>
        </1i>
    </ul>   
</div>
"""
'''1.转换数据类型'''
data = parsel.Selector(html_str)
 print(data)

'''2.1从根节点开始,获取所有<a>标签'''
result1 = data.xpath('/html/body/div/ul/li/a').extract()
'''2.2跨节点获取所有<a>标签'''
result2 = data.xpath('//a').extract()
'''2.3选取当前节点使用场景:需要对选取的标签的下一级标签进行多次提取'''
result3 = data.xpath('//ul')
result4 = result3.xpath('./li/a').extract()
'''2.4选取当前节点的父节点,获取父节点的class属性值'''
result5 = data.xpath('//a')
result6 = result5.xpath('../@class').extract()
'''2.5获取第三个<1i>标签的节点(两种方法)'''
result7 = data.xpath('//li[3]').extract()
result8 = data.xpath('//li')[2].extract()
'''2.6通过定位属性的方法获取第四个<a>标签'''
result9 = data.xpath('//a[@href="link4.html "]').extract()
'''2.7用属性定位标签,获取第四个<a>标签包裹的文本内容'''
result10 = data.xpath('//a[@href="link4.html "]/text()').extract()
'''2.8获取第五个<a>标签的href属性值'''
result11 = data.xpath('//li[5]/a/@href').extract()
'''模糊查询'''
result12=data.xpath('//li[contains(@class,"it")]').extract()

print(result12) 

(2)Xpath查找实战(此处借鉴别的博客)

#网页路径  http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html
'''
提取:排名':大学名称,区域,总分,研究生比例,留学生比例, 师生比, 博士学位授权总量,博士学位授权师均
校友获奖总量,校友获奖生均
'''   
import requests
import re
import csv
import json 
from lxml import etree

#请求网页开始
url = 'http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html'
ua = {'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'}
resp = requests.get(url,headers = ua)
print(resp.status_code)
#print(resp.text) #直接打印文本
print(resp.content.decode('utf-8')) #二进制编码 再转为utf-8编码
html = resp.content.decode('utf-8')

#请求网页结束


#解析网页开始
e_html = etree.HTML(html)
#1.提取标题
title = e_html.xpath('//title/text()')

#2.提取大学排名表
university_index = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[1]/text()')

#3.提取大学名
university_name = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[2]/a/div/text()')

#4.提取地区
university_location = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[3]/text()')

#5.提取总分
university_score = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[4]/text()')

#6 提取其他分数
university_score_other = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[@class="hidden-xs"]/text()')
#解析网页结束

#保存数据开始
#存入txt文件
list_university=[]
for i in range(100):
    d1 = {
        '排名':university_index[i],
        '大学名称':university_name[i],
        '区域':university_location[i],
        '总分':university_score[i],
        '其他评分':university_score_other[i*7:i*7+7]
    }
    list_university.append(d1)
#print(list_university)
with open(r'C:\Users\Administrator\Desktop\university.txt','a',encoding='utf-8') as df:
    for one in list_university:
        df.write(json.dumps(one,ensure_ascii=False)+'\n\n')
        
#存入csv

#剥离其他评分
dict_university_new=[]
for i in list_university:
    temp={
        '排名':i['排名'],
        '大学名称':i['大学名称'],
        '区域':i['区域'],
        '总分':i['总分'],
        '研究生比例':i['其他评分'][0],
        '留学生比例':i['其他评分'][1],
        '师生比':i['其他评分'][2],
        '博士学位授权总量':i['其他评分'][3],
        '博士学位授权师均':i['其他评分'][4],
        '校友获奖总量':i['其他评分'][5],
        '校友获奖生均':i['其他评分'][6]
    }
    dict_university_new.append(temp)
with open(r'C:\Users\Administrator\Desktop\university.csv','a',encoding='gbk',newline='') as cf:
    writer = csv.DictWriter(cf,fieldnames = ['排名','大学名称','区域','总分','研究生比例','留学生比例','师生比','博士学位授权总量','博士学位授权师均','校友获奖总量','校友获奖生均'])
    writer.writeheader()
    writer.writerows(dict_university_new)
#保存数据结束

猜你喜欢

转载自blog.csdn.net/weixin_45619006/article/details/108456562