今天有想法去整理一个简单的题库,题目和答案来源于Fiddler抓手机包,目的是整理好题目、选项以及答案,并存到文件中以便答题时查找答案
整个程序的关键在于GBK编码,接下来按步记录过程。
抓包得到了3个json字符串数据存到txt里,然后通过正则和json进行处理,详情见代码:
def getQue_Ans():
text = open(r'lgb_que_ans.txt', 'r', encoding="utf-8").read()
text=re.sub(r'[ \t\n]','',text)
text=re.sub(r'null','0',text)
text=re.sub(r'false','0',text)
data_lt = re.findall(r'"data":\[(.+?)\],"message":', text)
print(len(data_lt))
que_ans_dic={}
for data in data_lt:
#print(eval(data),file=f)
tp=eval(data)
for dic in tp:
que = str(dic['quesSubject'])
ans_opt = str(dic['quesOption'])
ans = str(dic['quesAnswerC'])
if que not in dic.keys():
que_ans_dic[que]='=='+ans+'== \t\t'+ans_opt
return que_ans_dic
对字典排序使用了sorted
函数:sorted(可迭代对象,key=函数名,reverse=False/True)
那么,关键来了,怎样排序?
因为第一步得到的字典是以题目为key的,题目几乎都是汉字,那么很自然地想到按题目第一个汉字的拼音首字母来排序,就像汉语字典一样。如何实现这般排序,请先来了解一下GBK编码:
B0A1-F7FE
。收录 GB 2312 汉字 6763 个,按原顺序排列。其实这一串cv的内容我们只需要关注GB2312汉字区,也即GBK/2: B0A1-F7FE。为什么要关注这个编码段呢,其实大家去看一下GBK编码表就可以发现,首先这部分为常用汉字集,其次很显然地它以汉字的拼音首字母排序,方便我们后面目录的实现。
代码如下:
def getInitialLetter(gbk_code):
#bytes eg: b'\xd2\xbb' ('一')
charGBK=int.from_bytes(gbk_code,byteorder='big',signed=False)
if(charGBK >= 45217 and charGBK <= 45252):
result = 'A'
elif(charGBK >= 45253 and charGBK <= 45760):
result = 'B'
elif(charGBK >= 45761 and charGBK <= 46317):
result = 'C'
elif(charGBK >= 46318 and charGBK <= 46825):
result = 'D'
elif(charGBK >= 46826 and charGBK <= 47009):
result = 'E'
elif(charGBK >= 47010 and charGBK <= 47296):
result = 'F'
elif(charGBK >= 47297 and charGBK <= 47613):
result = 'G'
elif(charGBK >= 47614 and charGBK <= 48118):
result = 'H'
elif(charGBK >= 48119 and charGBK <= 49061):
result = 'J'
elif(charGBK >= 49062 and charGBK <= 49323):
result = 'K'
elif(charGBK >= 49324 and charGBK <= 49895):
result = 'L'
elif(charGBK >= 49896 and charGBK <= 50370):
result = 'M'
elif(charGBK >= 50371 and charGBK <= 50613):
result = 'N'
elif(charGBK >= 50614 and charGBK <= 50621):
result = 'O'
elif(charGBK >= 50622 and charGBK <= 50905):
result = 'P'
elif(charGBK >= 50906 and charGBK <= 51386):
result = 'Q'
elif(charGBK >= 51387 and charGBK <= 51445):
result = 'R'
elif(charGBK >= 51446 and charGBK <= 52217):
result = 'S'
elif(charGBK >= 52218 and charGBK <= 52697):
result = 'T'
elif(charGBK >= 52698 and charGBK <= 52979):
result = 'W'
elif(charGBK >= 52980 and charGBK <= 53688):
result = 'X'
elif(charGBK >= 53689 and charGBK <= 54480):
result = 'Y'
elif(charGBK >= 54481 and charGBK <= 55289):
result = 'Z'
else:
result = 'other'
return result
def sort2divide(que_ans_dic):
# 分组 第一个字的拼音首字母
#dic.item()是一个元组列表,[(key1,value1),(key2,value2),...]
#匿名函数,传入key和value的二元组x,x[0]取到key,x[0][0]取到key的第一个字,转换为GBK编码
que_ans_order=sorted(que_ans_dic.items(),key=lambda x:(x[0][0]).encode('GBK'),reverse=False)
#返回一个列表对象[(key1,value1),(key2,value2),...]
f = open(r"re_lgb_que_ans.md", 'w', encoding="utf-8")
group=''
index=1
for item in que_ans_order:
newgroup = getInitialLetter(item[0][0].encode('GBK'))#讲第一个字符的GBK编码传入getInitialLetter()函数
if newgroup!=group:
group=newgroup
f.write('\n# '+group+'\n')
#f.write(item[0]+'\n\t\t'+item[1]+'\n')
print('%-3d'%index+' **'+item[0]+'**\n\t\t '+item[1]+'\n',file=f)
index+=1
f.flush()
f.close()
ps:这一连串的if-elif归功于另外一篇博客,里面是用java实现的,参见文末链接
对字典进行排序其实只用到一行代码,其余是第三步的实现
其实这一步的代码已经在上一步中实现了。
思路其实就是:
At Last:
if __name__=="__main__":
sort2divide(getQue_Ans())
利用GBK编码极大地简化了实现,但是同时也带来了限制。
我们关注的字段只在45217-55289
,也就是B0A1-D7F9
,也就是说我们只包含了部分汉字、常用汉字。对于其他字段的数据我们只能把它归于other
中。
说是目录和美化,但其实只是利用了markdown
的一些语法。但也是基于bz自己的数据较少,没有必要整成excel或者数据库等。
总之,虽然只是目的的简单实现,但也是比较有成就感的。
下一步打算用tkinter
做成界面,通过输入框搜索get答案。