20192111 2019-2020-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 1921
姓名: 蒋龙腾
学号:20192111
实验教师:王志强
实验日期:2020年5月28日
必修/选修: 公选课
1.实验内容
1.解析某网站的hxml,得到了一些关于《明日方舟》游戏内容的资料
2.将资料总结整理并且修改
3.仿照游戏内的抽卡内容,制作了一个抽卡的游戏小软件
2. 实验过程及结果
from bs4 import BeautifulSoup
import os
from tkinter import *
import tkinter.messagebox
from time import sleep
import random
import webbrowser
# dir_path = os.path.dirname(os.path.abspath(__file__))
# os.chdir(dir_path)
file = open('Kokodayo ArknightsData kkdy 一个平平无奇的明日方舟数据库 1.0 Wiki 维基 数据.html','rb')
html = file.read()
soup = BeautifulSoup(html,"html.parser")
sp = soup.find_all(class_ ='profile-container')
str1 = str(sp[0])
# print(str1)
listurl = []
listname = []
sp2 = soup.find_all(class_ ='profile-item-inner-wrapper')
for y in sp2:
str2 = str(y)
pattern2 = re.compile(r'href="(.*?)"')
result2 = pattern2.findall(str2)
listurl.append(result2[0])
# print(result2[0])
# print(listurl)
sp3 = soup.find_all(class_ ='image-inner')
for x in sp3:
str3 = str(x)
pattern3 = re.compile(r'alt="(.*?)"')
result3 = pattern3.findall(str3)
listname.append(result3[0])
# print(result3[0])
# print(listname)
lista = listname.copy()
for z1 in range(0,2):
listname.append(listname[2])
listname.append(listname[5])
listname.append(listname[6])
listname.append(listname[10])
listname.append(listname[11])
listname.append(listname[15])
listname.append(listname[18])
listname.append(listname[19])
listname.append(listname[21])
listname.append(listname[23])
listname.append(listname[24])
listname.append(listname[26])
listname.append(listname[27])
listname.append(listname[29])
listname.append(listname[32])
listname.append(listname[33])
listname.append(listname[37])
listname.append(listname[40])
listname.append(listname[41])
listname.append(listname[44])
listname.append(listname[49])
listname.append(listname[65])
listname.append(listname[66])
listname.append(listname[67])
listname.append(listname[68])
listname.append(listname[69])
listname.append(listname[70])
listname.append(listname[71])
listname.append(listname[72])
listname.append(listname[73])
listname.append(listname[74])
listname.append(listname[75])
listname.append(listname[76])
listname.append(listname[77])
listname.append(listname[78])
listname.append(listname[79])
listname.append(listname[80])
listname.append(listname[81])
listname.append(listname[82])
listname.append(listname[83])
listname.append(listname[84])
listname.append(listname[85])
listname.append(listname[86])
listname.append(listname[87])
listname.append(listname[89])
listname.append(listname[90])
listname.append(listname[91])
listname.append(listname[92])
for z2 in range(0,9):
listname.append(listname[7])
listname.append(listname[8])
listname.append(listname[12])
listname.append(listname[13])
listname.append(listname[22])
listname.append(listname[28])
listname.append(listname[30])
listname.append(listname[34])
listname.append(listname[35])
listname.append(listname[38])
listname.append(listname[42])
listname.append(listname[45])
listname.append(listname[51])
listname.append(listname[93])
listname.append(listname[94])
listname.append(listname[95])
listname.append(listname[96])
listname.append(listname[97])
listname.append(listname[98])
listname.append(listname[99])
listname.append(listname[100])
listname.append(listname[101])
listname.append(listname[102])
listname.append(listname[103])
listname.append(listname[104])
listname.append(listname[105])
listname.append(listname[106])
listname.append(listname[107])
listname.append(listname[108])
listname.append(listname[109])
listname.append(listname[110])
listname.append(listname[111])
listname.append(listname[112])
listname.append(listname[113])
listname.append(listname[114])
listname.append(listname[115])
listname.append(listname[116])
for z3 in range(0,14):
listname.append(listname[46])
listname.append(listname[47])
listname.append(listname[52])
listname.append(listname[53])
listname.append(listname[117])
listname.append(listname[118])
listname.append(listname[119])
listname.append(listname[120])
listname.append(listname[121])
listname.append(listname[122])
listname.append(listname[123])
listname.append(listname[124])
listname.append(listname[125])
listname.append(listname[126])
listname.append(listname[127])
listname.append(listname[128])
listname.append(listname[129])
for z4 in range(0,19):
listname.append(listname[130])
listname.append(listname[131])
listname.append(listname[132])
listname.append(listname[133])
listname.append(listname[134])
window = Tk()
window.title('明日方舟模拟抽卡器')
window.geometry('997x766')
window.iconphoto(True, PhotoImage(file='kroos.png'))
var = StringVar()
photo = PhotoImage(file="BG.png")
l = Label(window, textvariable=var, image=photo,compound = CENTER, fg='black', font=('楷体', 36, 'bold'),justify=LEFT)
l.place(x=498.5, y=383, anchor='center')
on_hit = False
def hit_me():
global on_hit
if on_hit == False:
var.set("正在抽卡。。。")
sleep(1)
p = random.randint(0, len(listname)-1)
q = listname.index(listname[p])
if q in [2,5,6,10,11,15,18,19,21,23,24,26,27,29,32,33,37,40,41,44,49,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92]:
a = "恭喜!五星!你有一副欧洲人的面孔"
elif q in [7,8,12,13,22,28,30,34,35,38,42,45,51,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116]:
a = "可惜!四星!下一抽一定会出货"
elif q in [46,47,52,53,117,118,119,120,121,122,123,124,125,126,127,128,129]:
a = "惨!三星!你的肤色一定很健康"
elif q in [130,131,132,133,134]:
a = "二星。。。没救了,抬走吧"
else:
a = "WTF?!!!欧皇分我点欧气好吗,秋梨膏!"
tkinter.messagebox.showinfo(title='foo↑foo↑', message=a)
text = Text(window, width=50, height=1)
text.place(x=498.5, y=200, anchor='center')
text.insert(INSERT, listurl[q])
c = len(listurl[q])
text.tag_add('link', '1.0', str(1+c/100))
text.tag_config('link', foreground='black', underline=True)
def show_arrow_cursor(event):
text.config(cursor='arrow')
def show_xterm_cursor(event):
text.config(cursor='xterm')
def click(event):
webbrowser.open(listurl[q])
text.tag_bind('link', '<Enter>', show_arrow_cursor)
text.tag_bind('link', '<Leave>', show_xterm_cursor)
text.tag_bind('link', '<Button-1>', click)
var.set(listname[p])
b = Button(window, text='抽卡', font=('楷体', 24), width=10, height=1, command=hit_me)
b.place(x=498.5, y=600, anchor='center')
window.mainloop()
file.close()
结果展示:
码云链接:
应用下载:
提取码:6u1j
3. 实验过程中遇到的问题和解决过程
- 问题1:标签太杂太乱,需要的数据很难找到
- 问题1解决方案:打开原网页的界面用F12的开发者调试工具来找到对应数据的标签和属性
- 问题2:需要提取的数据内容在标签的属性中
- 问题2解决方案:利用正则表达式筛选整个字符串当中的herf属性,并将其中的数据保存到一个列表里方便调用
- 问题3:列表当中的数据都是平权的,我需要一个加权的功能,但是扩张列表之后要定位到原来的数据很困难
- 问题3:解决方案:利用copy函数在加权之前新建一个列表,并用index函数找到扩张列表中第一个被筛选出的数据的位置(即在原列表中的位置)
- 问题4:py文件需要转化成可执行文件使用
- 问题4:解决方案:安装pyinstaller,在命令行执行相应命令进行打包
- 问题5:更改窗口图标时,用iconbitmap函数无法准确定位ico图片所在路径
- 问题5:解决方案:改用iconphoto函数,默认是py文件所在的相对路径
其他(感悟、思考等)
感悟:
学习一门编程语言是很难的,在这短暂的一学期中深深体会到了这一点,特别是对于我们大一新生来说,连C语言都刚刚开始起步的我们更是难上加难。可是越是如此,越能狠下心来钻研,不懂的地方一定要弄懂,为此反复百度,查阅各种资料。等到当下的问题解决了之后,回过头才发现自己的水平更上一层楼,不仅仅是对问题的解答,更是对整个逻辑思维的更深入理解,对于我们计算机系的同学来说,这份理解是最最难得可贵的。感谢王老师一学期来的陪伴,收获颇丰,感激之情,溢于言表。课结了,但是python语言学习远远不止如此,没有人能在一学期内掌握一门语言,所以未来我也会更加努力,更深入的探究python的奥秘。
参考资料
- python爬虫学习(一):BeautifulSoup库基础及一般元素提取方法
- 使用pyinstaller将python程序打包成exe执行文件时遇到模块找不到的问题解决办法
- Python GUI之tkinter窗口视窗教程大集合