将某市医师服务协会网站上的定考模拟测评试题导出PDF

给朋友帮忙,想将某市医师服务协会网站上的定考模拟测评试题导出成为PDF,方便在手机上进行学习。

经过操作分析后,网页是每一道试题都是一个json数据,需要想办法直接获取所有的数据,代码没有混淆和加密,可以直接尝试调用已经存在的方法。
在console口直接执行下面的代码,在bbresult中就可以获得所有试题的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var bbresult = [];
for (var i=0;i<ordersortArray.length;i++)
{
var nextItemID = itemidArray[i];
var nextItemType = itemtypeArray[i];
var nextOrderSort = ordersortArray[i];
$.ajax({
url: '/Service/Web/GetItemSingleByPaperCodeAndItemCode',
type: 'POST', //GET
async: false, //或false,是否异步
data: {
'paperCode': '1758ae61-7dc2-43b5-a726-2c81cc9fec9b',
'itemCode': nextItemID,
'itemType': nextItemType,
},
dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text
beforeSend: function (xhr) {
},
success: function (data) {
bbresult.push(data);
console.log("题号:"+nextOrderSort+", 长度:"+bbresult.length)

}
});
}

取到的结果示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[
{
"DataCount": 0,
"total": 0,
"Status": 1,
"Msg": "试题加载成功!",
"DataList": {
"PaperID": "1758ae61-7dc2-43b5-a726-2c81cc9fec9b",
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"Caption": "<p>患者女,68岁,风湿性心脏病史,牙龈出血1年。检查见牙石,牙龈红肿,探诊出血。对其进行治疗时应注意以下内容,除外:()</p>",
"ItemType": "A2型",
"Remark": "心脑血管疾病患者的牙周治疗时病史询问和收集要尽量全,对风湿性心脏病、先天性心脏病和有人工心脏瓣膜者预防性使用抗生素以防感染性心内膜炎,在接受牙周检查或治疗当天应服用抗生素;可进行牙周手术治疗,但进行牙周手术的患者,抗生素的应用应延长至拆线后。还可在治疗前用过氧化氢或氯己定含漱液含漱,以减少口腔内的细菌。美国心脏病协会强调“感染性心内膜炎的易感者应特别注意口腔卫生,以减少细菌入血”。",
"OrderSort": 0,
"AnswerSortNum": 3,
"StrAnswerSortNum": null,
"OptionList": [
{
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"OptionID": "fa278e33-cf73-4da6-ac5e-01021ff964a0",
"OptionContent": "接受治疗当天服用抗生素",
"OrderSort": 1,
"IsAnswer": false
},
{
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"OptionID": "ccc63faa-ac42-4542-a781-18ec03e40683",
"OptionContent": "治疗前可用氯己定含漱液含漱",
"OrderSort": 2,
"IsAnswer": false
},
{
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"OptionID": "d687911e-37ff-46be-9687-9326666eb2b3",
"OptionContent": "避免进行手术治疗",
"OrderSort": 3,
"IsAnswer": true
},
{
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"OptionID": "6c5270c1-e6d8-4b94-ae34-7ad9a6b3cf22",
"OptionContent": "口腔卫生宣教",
"OrderSort": 4,
"IsAnswer": false
},
{
"ItemID": "00abcc70-5f06-4b6d-a821-dd93af2d97c1",
"OptionID": "c1ce0f1d-0fe4-47fa-af33-f4ce172476b3",
"OptionContent": "详细询问病史",
"OrderSort": 5,
"IsAnswer": false
}
],
"A3A4B1ParentItem": null,
"SelectedOptionID": "d687911e-37ff-46be-9687-9326666eb2b3"
},
"rows": null
},
{
"DataCount": 0,
"total": 0,
"Status": 1,
"Msg": "试题加载成功!",
"DataList": {
"PaperID": "1758ae61-7dc2-43b5-a726-2c81cc9fec9b",
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"Caption": "<p>关于生命价值论的理解错误的是</p>",
"ItemType": "A1型",
"Remark": "根据一定的社会标准来衡量和评价的人的个体生命的自然素质的质量状态。生命质量与生命价值既有联系又有区别。生命质量是决定生命价值的内在要素,是生命价值的基础。生命质量是对人的生命的自然素质的社会性衡量和评价,即它所衡量的是生命存在的生理功能状态,它用以衡量和评价的标准是生命存在的生理功能状态能够去过一种愉快、健康和有意义的生活。",
"OrderSort": 0,
"AnswerSortNum": 2,
"StrAnswerSortNum": null,
"OptionList": [
{
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"OptionID": "dc835eae-18c6-4770-9670-b28e103040b8",
"OptionContent": "生命价值论是指根据生命对自身和他人、社会的效用如何,而采取不同对待的生命伦理观",
"OrderSort": 1,
"IsAnswer": false
},
{
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"OptionID": "cdf00a87-53a8-42b9-afe7-9efbe3383c4c",
"OptionContent": "根据生命价值主体的不同,生命价值分为正生命价值、负生命价值和零生命价值",
"OrderSort": 2,
"IsAnswer": true
},
{
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"OptionID": "28a0d551-6afc-41d4-aaed-7fce3f73546e",
"OptionContent": "根据生命价值是否已经体现出来,生命价值分为现实的生命价值和潜在的生命价值",
"OrderSort": 3,
"IsAnswer": false
},
{
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"OptionID": "c1c99cb5-a8ad-4958-8620-99153acf7f00",
"OptionContent": "生命价值论为全面认识人的生命存在意义提供了科学依据",
"OrderSort": 4,
"IsAnswer": false
},
{
"ItemID": "01a4678f-f17e-47fd-9781-8f4750a80aab",
"OptionID": "88b59efd-912f-4b83-bbc0-5374ca0f875c",
"OptionContent": "生命价值论为医护人员对于那些濒于死亡的极度痛苦病人做出医疗决策提供伦理依据",
"OrderSort": 5,
"IsAnswer": false
}
],
"A3A4B1ParentItem": null,
"SelectedOptionID": "cdf00a87-53a8-42b9-afe7-9efbe3383c4c"
},
"rows": null
}
]

将得到的500条数据直接存在一个json文件中,命名为data.json。
利用下面的代码,就可以将这个json文件里的数据,成功的转换成带有格式的PDF文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import json
import re

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer


def remove_html_tags(text):
"""过滤字符串中的HTML标签"""
clean = re.compile('<.*?>')
return re.sub(clean, '', text)


if __name__ == '__main__':

with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)

pdfmetrics.registerFont(TTFont('MicrosoftYaHei', 'msyh.ttc'))

doc = SimpleDocTemplate("paper.pdf", pagesize=A4)

# 定义样式
styles = getSampleStyleSheet()
question_style = styles["Normal"]
question_style.fontName = 'MicrosoftYaHei'
question_style.leading = 18

option_style = ParagraphStyle("OptionStyle", parent=styles["Normal"], leftIndent=15, bulletIndent=20)

elements = []

for index, value in enumerate(data):

d = value['DataList']
ccc = str(index + 1) + ". " + remove_html_tags(d['Caption'])
question_style.fontSize = 14
caption = Paragraph(ccc, question_style)
elements.append(caption)

for o in d['OptionList']:
question_style.fontSize = 12

item = str(chr(ord('A') + int(o["OrderSort"]) - 1)) + ": " + remove_html_tags(o['OptionContent'])

option_paragraph = Paragraph(item, option_style)
elements.append(Spacer(18, 8))
elements.append(option_paragraph)
AnswerSortNum_paragraph = Paragraph("答案:" + str(chr(ord('A') + int(d["AnswerSortNum"]) - 1)), option_style)
elements.append(AnswerSortNum_paragraph)
Remark_paragraph = Paragraph("解析:" + remove_html_tags(str(d["Remark"])), option_style)
elements.append(Remark_paragraph)

elements.append(Spacer(1, 20))

doc.build(elements)

PDF效果非常不错,放在手机上查看清晰可读,收获范主任稀有的赞一次!

声明:代码不会对任何系统产生危害,所有的操作都是在正规注册付费账号里合规合法完成,未传播任何带有版权数据。如有侵权,请联系删除。

Notice: 正常情况下,这里会有一个基于utteranc.es的留言系统,如果看不到,可能需要科学上网方式。