From dac7451399bc64fa626d9f57a36b712e911d9fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=96=87=E7=90=B3?= <2509165042@student.example.com> Date: Tue, 23 Jun 2026 11:30:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- movies.html | 152 +++++++++++++++++++++ movies.json | 105 ++++++++++++++ project-1-at-2026-06-23-11-26-7a3b73d4.zip | Bin 0 -> 25927 bytes q2_1.py .py | 74 ++++++++++ q2_2.py .py | 38 ++++++ 5 files changed, 369 insertions(+) create mode 100644 movies.html create mode 100644 movies.json create mode 100644 project-1-at-2026-06-23-11-26-7a3b73d4.zip create mode 100644 q2_1.py .py create mode 100644 q2_2.py .py diff --git a/movies.html b/movies.html new file mode 100644 index 0000000..06aa7f5 --- /dev/null +++ b/movies.html @@ -0,0 +1,152 @@ + + + + + + + + 电影列表 + + + +

电影列表

+

数据编号:B-20260623-9584

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号电影名导演上映年份评分时长(分钟)类型主演数
1三傻大闹宝莱坞Frank Darabont20227.3138爱情5
2盗梦空间陈凯歌19927.4163悬疑5
3阿甘正传Robert Zemeckis19917.8142科幻3
4忠犬八公的故事James Cameron20108.8137剧情5
5星际穿越宫崎骏19957.5151悬疑5
6泰坦尼克号Christopher Nolan20238.4122悬疑5
7放牛班的春天Lasse Hallström20009.5140爱情3
8霸王别姬Rajkumar Hirani20229.3179动画5
9肖申克的救赎Christophe Barratier20199.3146动画2
10千与千寻Christopher Nolan20037.4106动画3
+ + \ No newline at end of file diff --git a/movies.json b/movies.json new file mode 100644 index 0000000..1f870dd --- /dev/null +++ b/movies.json @@ -0,0 +1,105 @@ +{ + "data_id": null, + "movies": [ + { + "id": 1, + "title": "三傻大闹宝莱坞", + "director": "Frank Darabont", + "year": 2022, + "rating": 7.3, + "duration": 138, + "genre": "爱情", + "actors_count": 5 + }, + { + "id": 2, + "title": "盗梦空间", + "director": "陈凯歌", + "year": 1992, + "rating": 7.4, + "duration": 163, + "genre": "悬疑", + "actors_count": 5 + }, + { + "id": 3, + "title": "阿甘正传", + "director": "Robert Zemeckis", + "year": 1991, + "rating": 7.8, + "duration": 142, + "genre": "科幻", + "actors_count": 3 + }, + { + "id": 4, + "title": "忠犬八公的故事", + "director": "James Cameron", + "year": 2010, + "rating": 8.8, + "duration": 137, + "genre": "剧情", + "actors_count": 5 + }, + { + "id": 5, + "title": "星际穿越", + "director": "宫崎骏", + "year": 1995, + "rating": 7.5, + "duration": 151, + "genre": "悬疑", + "actors_count": 5 + }, + { + "id": 6, + "title": "泰坦尼克号", + "director": "Christopher Nolan", + "year": 2023, + "rating": 8.4, + "duration": 122, + "genre": "悬疑", + "actors_count": 5 + }, + { + "id": 7, + "title": "放牛班的春天", + "director": "Lasse Hallström", + "year": 2000, + "rating": 9.5, + "duration": 140, + "genre": "爱情", + "actors_count": 3 + }, + { + "id": 8, + "title": "霸王别姬", + "director": "Rajkumar Hirani", + "year": 2022, + "rating": 9.3, + "duration": 179, + "genre": "动画", + "actors_count": 5 + }, + { + "id": 9, + "title": "肖申克的救赎", + "director": "Christophe Barratier", + "year": 2019, + "rating": 9.3, + "duration": 146, + "genre": "动画", + "actors_count": 2 + }, + { + "id": 10, + "title": "千与千寻", + "director": "Christopher Nolan", + "year": 2003, + "rating": 7.4, + "duration": 106, + "genre": "动画", + "actors_count": 3 + } + ] +} \ No newline at end of file diff --git a/project-1-at-2026-06-23-11-26-7a3b73d4.zip b/project-1-at-2026-06-23-11-26-7a3b73d4.zip new file mode 100644 index 0000000000000000000000000000000000000000..d7874b5ac0a22bf32db135e455d02f1b32c8cd63 GIT binary patch literal 25927 zcmaI7Q;;uA@Fm!`dE2&a-L`Gpw)?hi+qP}n=C5sA`|ZqsV_znwA~Lfc@|-x4Z&{V8 zAPowJ2K4_PLG3l2|8@Bv2l-#Lv^6w0b!Jfbzb4rj8kySs|4C5)i|Jm|pa=Os2E_ji z_CGVWF?4n|b*6XmaFLdy1sqGs(HVwqDc{{T~7o7zhaFzi4Og z@*mF1+1{?|>R_S44qn|QaA)O6{U(WWxkCWjKZ=YX)9g|2@ISj%7~jmw3A z=`Y@REgvipLhteyy4rgm#pG$9dNx66E8zdp4E4V?lhy@p z`x*iPITZi_5&ft6f9l4>ZpOrJ!pcNBRi;moAF{<7DQyt+Af5sou`i^t+~^!9EBFhvt$!*7jZhdSJSlV100AczOnm4Fqa^wx%xw66Z4waS6jL zwWivp9t-ylxTMSAF(bpUsBI8q$ou=?8wmDwb>}lS*W{R~W43iKME$^Ud&(A2w!8AE zdqygS+jW3F-kYOu5SJfcoZLM9FDO!KEJamirCI(mdx5X2%zxo2G2{K1M%{k5v7x2Q z_ICf|#&K_HYKwyMO;N%^!$ZX9uaT0|WKvlLR)*$Aos-__2|9XOa%xInUHRAi{QC0t z!@aWgTH8(TZtu@OAznipA0sC#FSFF<=I%x*y`pM+n~xDNMwajAN9DeD!@gFVTHvix zeHm?D4#a)4jm}%j%bO%}n>AgJ7aHE}QE%#-<1R0^dt=OS9}XR!wnu470GVV~?f1!s zz=_8GFT>o=$@=fTHPZUPG#CRu3r7IhS#xywv&@6=M^wNNn&TiM9R5*$@?09;*e2a| ziCvA>A4d%OUztevZyQ?OL#~D!|FRZNZHB6<)-Ul%ORLU|smDvvQ#3}ku{_!89V{%D z*|x};+))wZ`*$s^{WVu8iR!;h$u5>sZghA!P)ACUBw(zkufhT6%tq8tJYdz2GJk;# zZ|Sxl;Mnk~k7lR02@{z|a-@epn;J~0v7a9B@ zmXLdq7;9(N=d7TBwVHl%?%HAtw|;XE>io@L>7k&!(}CPn3U>ycjUOu-jc3uqVl|#3 zF*qID5kU%N2@Ous7nw<#gHrjRfQxxe;>4!7{otoKW4?~>7{dIyzNQZJ5q_QC(uVqQ ze~#~dFA*@QlRza_*O?gKD(!+pp(SSXhLSxP>hgTm*nQZY&cPjal9Of(`TZvwXf&%y z*ZQmAzAN&)&hCErRw5hWUp5kd9{H-asDzI=kdXRffx{T1-yoK2dd+ky@aRf*(wIPM zNnveqPyW%x1qN_KDG0%$u3H>*AkD9V0c+-^X`3?FQzUq|O_}h%mDxf@#<;6(>18mo zoqIBSSqgoD9#TfE-M$E5M!X=-eT#r%p}@-BfX}=a zJ<)eF2=5>qL|@rTpeJDMYReq%b&&j9`umri>s(*VgglPQ(+nr@{tO^5gKKt>)92p0`WQTu(ZV0SI;A?7XQh$ zPMyR|hgz#-8pf1M#d>)|y19^ClBrT9%okv_-G@(>u;|!$ zetsDk-wCyR^oC($fx*vd3omFK2;gb6nLxiy5$3A;%gp%5%8YV7%9enILO#;T=da>I z3XV^B)mA(884G_?Yc3_#Zyp8}R1UIn%2lfG>%nC`WLi zc=9i(m?}lG1bX4tSEu2~Amgn#j zw|;9`r2syUT_>2Y9`1}aS#4c#ZQD;R-o7__P6P`E1YqmyIzaM;vl(^LO7gwRSa(tq zgYy5_i5DY#?LJDlA1pJ%Lt#2UD6a$T;&WhT%0~lIw>0?y=Qg9(g`jpqN4x+wu7(wK zqKn;SJi@bjp7a$UPY<`goA7B15U{szK@soj*3X^l$n$>4Wa%Tu8U2)CpxZbKj$I?# z7dDje-K4LUuV}sA9%H%72xzlQOYhlSFINZ5kD+`=bM(eojnhiPBvU0XE8|a9sPSF3 zf<%%vrVmMC>w}sIguRNs&bsG_TqyI-uqBBHYM*t{$28w_;F|r#2z0O&Nb=I{uR3Sx z)6GBT$@O#(*JpL;56yRN?JES~@ZbI%RSA1IEVH;lL&0Kqmr%mAlE;ETQUM7L)u1QJ z+_2XJx987!6&o&1-kg#cb?pRTA*)6NmUt*Uf0rfwE8Yx_z*cKtx?gW_F`haok7vd8 z(r~G8=|Bk6Mk59am8a6e^l@^rMAY)qHwaktWwCc_sH7`0h2mCsNzWQHT_`!XeO;r^ zAMb81c$11xcY14hc1XRqX=#fq!uL$H#SX||w5u_@iLD~ncHxFD(- z8SGBstt0FQ<4(G^C)@Hl13dc*=T3I65NqbE4loFx7ppHlB z$A(<>lM%3uZn{MEJV={PSm(K2lzdxZx7Um;%Ren7>kl_JFJv=nHL9Y-xFXgV-FjZ1 zCnPhn;8a6>aNp$T6bi_9+|fujq-&K_;^?tzazt){{H6PE_>iTMJs*ieS~qBS<5r z*G^M+7r<#Q6z+ow#5cR)(lK#cZ~;`_OHp5rZLmy-Av9XXh*Z2|V_#Yy_r6Zvp^Gea z7u#*vd-FNj45GQ!C-_4)k37=27(6n`h|bh2y!<7moQVPjW222zpCD`RsGri0X_ey~ zXC2sfDxy+cs_LhHvZp(a%YnakJw?RMd;528dEF2FYR62hr5sKq zlCJO!&=9);4q~`(CF!Q_*04!8jV@x*_|6w-9ynZ-dSSF;kbunUI5m2L)|~{aoPOjgG5$I>oG6Zn zs0Vvd-5pjce$jjS-?q~uxoMAso;NDhr*T|+5_{CIlZ&hq zP|EZP?QQJ%0B=y$m(gl^l!k89IfjyMt|1N!L8w9#g%&e4p9GAJDPoRGntE-D9InDb zXn{MaVK@0ImCA|m)oGe+ggQ@5Er0-bm%ojAgtZ~|X3_Gl9sCBbVbfTWUSKZ#PD=2F~WWMYUf zn-!@D_=LT9T{(UMl|9eNJep zenyKuSVMn{ZGW=ESy|R=a)c5hQSIrc>_w&8v`Me!`dpb1S+Xc}`Wy&ava}HvW4VR? zMuE2_&jd#|ZFPVoT2qQk(QwU@&LCfssD2UoxyM(H(J{9DoJqjP>h1`BpYr-uN&BJQltV zu^oG>M>oU2V+A}{>pUhuyIaR{ewuBMyF*QR|0n)TD1^ja9To}oVhvqs%utv+&1&XP zeQJSuZK|)UyBY^6IUfP#hnd6o80xD^pEpKMC9Z%@%n-M$V8uk_-(sz(2EpYf)}AgT z!UU&IB@h>E0#2KS`WrtH(=Jek-toycn;FZMjc7#7`G3?*aU+`(uoL1IguLXC0{Rd2 ziH%zf+rJLj98P=%&ByuoJx$m=@7y3+(4vo};;L7BIF7SuKE}z~l%|y(3T}5>kR^{$ zf3W#(Com|*p55B(^h7cD)3L1dY>bhRJaU3P%SpLk2Ri$nMLsa6wCO%4vw`NsO?p}Q!+S?^4vN&yGt;s<>Z%I+ltTZpG1v7KEi`9!et9;!&U!=QHJ!yKz=p2(raTp-nkd= zy`E9r;@kDB!eH08`yScM%jup%5dv7Y+^NZ?5EM8}oTI{@x)=`$k-kFd*)5Kvx2r$p z)G$ZDXuH-T7t8*YHFYYr>s?DO>nJlWcS z6XD}uy=^66SlEDocll6Z{UimI&Q;v(fG8W)Xk1^zQCs9rGzK4o)$-s%)#akGYExea zO3vNwZ++raJkN9v38z*UWK6d@o-58qRxaFC?DnMlC+V0?P#|W(%Ygl3UlbHBh-Vfo@;p^(^87HT9t$bJw%q4N z(Iy+7V=-iA#k!qL^NS`x1&3z2lESPhCvp}#?sgHaYz|DsD>jW-Ho_PlJNGZgba97o z_pFg`waq8Q-_s*z3U#!Em(ieDy0gS=%2}ttN<+iQA@dOnKcSa!e0q+LkJb~a`zJ!6 z`8NdNEe+Pzjn%5ayPHDo+6Q0UNMh_gsxbm7xi%?$*BAgFpyZ^V=YzZmj_utScvh$B z&Z#}Jclm&C&Lre5Am*+1FBf-dEJ_KZzMD#37Z$M>i|)a+3x<^pkJzjAa;>d0GkDt! zEIvAv>mGJeg;z@Ig~cbUn3uW5<8y@aN;d;pFP0WnEtc2Wtki%e*4GTU6++$Jk#?kqJAJG)Hn`=1w~76C&h5$V=+l^=(e!r_#OLBdc`>2nb;g8XTFD(#> zq-b52L6PBglEy+_)^ZnvhKoAKHZahbKRLIdlPlFm3GS612f1A=<ru80u8bP3xYrHcflZ~tq0Gj#V(TTLy9?-GYuHHSIzsXvhFwIr{RwYEY+El2$I#hVy%ZY6v>$d61 zHJ=O1uAEfMu?qd-F+j*X_euGbl^0hl1T*8S+Hr_@09>D>@I>?RA$UWMj9Ju?x_ORQ z=@Xj8A-d44R`2aLWp)OIXVjP(n;CBvII7Ng%2(S3`Pt@1dR`P5JOs;gm$T^{4x$zf z%GhFI2J?-&On(65xvKY#PkH!letf0K&D7(A!fh38F5ZHFQu)8y6~|s_z~H{4=nW+j z*Rgk-!SQSCborEU84ZJRgtn&Cv2`xEx;0x=iB*4iYAL>zll>d@<6j&&r|t@xv>w~6+c#{G@=z5fNdJ40 zLm~W%^w6Z{8EiNuUj5Qn`UuDaX-F@lIzK_xet}SPG1J@Abh>IB2tM0kYGV>?nH3_me+!anhs!Rh6hW7SWa!l%-^ zyLi2iuteJ;CqglyPQv6hJ#x71EwZ$4RziFYVQon?tO%B1`P@+XvzS3MH(vRqBp_Sa z+5;=vMwQAIBiM6Y`lR)3#*tV1SD4#Zf#&gfj3Kj0V<5$1xui}C;%9bqr}p((li1qVCELDon->+In5A0mAQZ}aJDW=}2r&>r8F*!32l7*oEa-QW z56D>Uv+644X;~5m)km9_UU=Zmw=-|5CC#f;7JIJCO$#th^{F>|y9|{4s}P8{U9pRT z4Wa-%6Upk^;`eg!dp(qd>$yfN(a%KY<2b#K#frhR6s(Zc@zSq@F)<|y%2DBsD(V8|IZ!(8CcJ6r^$3)S0tjtANLHIpf z4$(ge1?;-YBpedlc)n{%4VlCI?H3M>O4TJ<K7S=6v&ZcU4Vvy%1)3spKo9&&)Y-D_q904NRsDz>fBMs`l% z)cF(0ZGD^{K)JNNvtr8DWZNJBGfd(*vcmsyLn1T<8S@9`g9a%*mY789ABhaHz9kj; z^&aL18((^BxEzaCcLpQe2h)jeBF3Vyh=#j@M%oLa8(eH#l@bE-L(^+;4bg}Ud*p=x zk>d_CrqYu_>gP<8L^lWpIs&V9KM*cPau$1t4)cx1BfLJ~)}`1724g)6V&8`d%OmK5$L&M+ zoN^v}IB;On^-~yu3n$D%*RA3SzhoVD5VKXoh?^zRJtE|lj2oTEuBC1J;0b-F@j}f&CVlHsXS;8Aj<#a`Y_W2< zJbq@zEwG8Io@!UW@SYZJ1`V=iyQy$5BY?&HRbl`zSX8gTr5-(4Xo#S4BE|^iJZPkf zUz0xt6Z15r3mkJ>kb0^5WtOG6S5t&^B)kR+p`IaHs0)vu5<)R8AU*Con6u3XeFjI1 zYN(hZy}2n}EAbg!&yA2#62pa|oM819i$N*b8|FTZX~bWNzd7b zU6qTSx^Ml(yvho41}7!-PB)D|3l|*VSk@V~y-iiKa#qn0Uxq;@gI$0*`kS;X7Z?V0 zos~aYYF0c~XMU7`0?W+4GCU<|1erKJ6Lp76qv>NARnS};G^-mKbRtZPFKWt?BjlYW%5~zBA z-{`xx$t})f-vYQLV<7%d5^6Y@P9NjY)GY`uk1&{Vs3N(l8a~Lp^qtQjT=I150xED4 zd2~7<7}yoO0*6qK@XtGGXgGKZ*42KbprX(B(|-9CgnyfaE2Db1@OKQ27OvT!ZND{% zb}#w@qDkD``_T%dIy+Q7mm*@?+J^uxC86P86TYch+b5jg@DXr(s<7DGS~ph9FDKf@ z#ecdDbICupboUXl_=DWw)aC0mVfM zZZjgB2?>|X1qD|X4iHbKOaNR2IHMZ);ptT;pNu9PB*&{~nI0OB`TUqP-=KgO2OCa?Fnxx;*bt)jFz?4L?t_djv`{|-Zm9DE%SYmH~Key#CDQ$7yy zh87X`7Zq8-nMPR7-9bPA$?-U7SCdOF_IP@amgo0-m2$~2a1^FT9)xgIjh-zmU`LTX zBIlX@LMZS&tFNVhf%q&H|A3ge>SxIpPX!Vz2~*uA^Z>6fuxUN<98p>gnKa;#_u=hF z^r^Q&uiEXNF86`~+usWIhwA*8J3LY0&NY+^;=XUgNTh{VDB6qBO>i1a@GKzZD_`JA z9||$coP=XU%bzp;GZ}fFVR91|WGfK!=}8aX2*T?PBQK5~+noxJC-W!CeH&8dorXtZ z{D1+DLy95I(~c>T9yXST=r4F+Vg{_ZX;69EHuWB})(XpN@X=1l;Q1d3jGIp514^)cH;r2n5d*nTsjV=hsI- zHKyw(CtpA~Zq$jsMn@vF6lx6!AjZY*t;>?8OWgkoDkK|cv4T%^NmC|Hkj8ArVxyai zC`X({69H+F+4RGo)4IgqbxsMkX;^@TrRGUV@k$NY?`X7&uJ-4uV(Ju z7B-m4B!7p>fS0^0M2%N?N-ix=t4%QlD-!m0wT9@^ea_h2u3$n(BXd*3DMEvSA`u8w zt{lm*`}80U^-!QN{~mQW6v+g3gf)e^`z@i(j|(!h{Uf1F^a`5~)sk6PRu1}`h6H0$ zu@Xd2XUG0R$9gfj{v1I(ui)O)S{p?KUe*=(E>IC6R zZo4n04VFwPYwYz>whN>~3|BR;$Pj?9Yzc*_Q=LFJ5P_r5%%7nmk-Kk5$%r|#pyX

E6)P!Ex+S`j1Wc3 zw0Lic3Iv%BRL4L){~VmlMWu!dDBe@hHX!>znnM~M3zFV*O*?>%(TmE~vJ5jU#CqVK zMq|Bm{@!QQNJ?scs_F%Urpf7pAn*ePcmqKMsZ$-zv4P^0JqdPz+yTDo4AjzX95>d>=znWYOoGSTGSS}`Ku2AaNYxN zafKUi<;Sod!FnS+n`X>z50i?7R%ZncqO=aiGlm*FK4z_fucexMv2B8sZJsG(tVvE) z{-rj3r`Zcn^q568o-soa_O2KN0bMt8LO~@CC_Ti#S?lRUD^Rr4sG-KYM4-IJ-6KQu zctZvcG)YPbhi5%$L8TAI2muL(rM)Z+DISGdNYctGK!Rk-5C#NwAm}Kzi7TKH6A^+e zy`3VU4?x(7!Gcw9zxTp}@V5g933-$3{zz|;j>{81V}rh`3l3$x3F9FPo#HN=UX2I* zd-{kY$wYPe6;kN4GVB+RF+R5!GQax3)~Q@3$|2m>mye`+s~el5h+ugcPCV$&vy@&o zy(1lBG6{b}?LAQFf{KGAXbm=cBAIezrH029{aT|7BuIc_^9jUkFfco~#xJuLw=3&QA+<1|o2Ud@^O$+bJD5s9*)f4>Gc3)a}a zxi?UjdmpT1GjaeB|Be7$_|A6|`1eM44Zb+NeW3(OEm&arPrbl82E>vUY>a&8eU}5n zp@X3IMySs^o;md4*@JUV5Q(ND2;9xtRvW(L*qMipR^Fcx1kS`;C0;0qeSC&m#buIL zizfSAQ2auP>v&LxuqHa(M{=E}KqG8pwZ2zb#HmpYeCbue@w95bF)$4}lfD8kVpVAU zVZ!|jCM*ygQ(;fYdvmW6KvR(pp{5Z`&=|*7rHQ4(GgPub^Nc z=R*2!xNgQ>y`G3)-@fh_4EKf~?ICxqY)M=F1b$B*cr}-Q^857u z9`H+oetGPf%N_C7-y?+5;$qRqcDMO*#&8~^eEl#6g6Rzoc)hY=euWwH#dUz*+3 z9`!sRMCYV5 z-g{>I8yj@0ApT$vZK;?*M}iM!#!s0%kE)(|qZWY~fq#BEPGe9po15KKHyV%jQpUg*c4{UM%lkmU=;|O3 z%R1-es?jxlXGl>f?zJVo@~uTWLh;|0SsPvM{)hgLA==3b8iY4Cn8bN(Va36|%%#oD ztJS@Lt=C-RVECFKU`J;YP1RxoI4mYXQM(vyKZ&AG6u+9pchq%0bd9p~+S zCY>|9LljCdMVeCG+lK$hu7eo?7Qdx3BN+F5wD*z7!?ksYksMkM$~{59M1SQ5IJ z5@Tr<-akm3><+Ux8cktwcbMl^cEs@+2A$8=JysFG*JU`}Fdbq5IzMl!1*L$&8WhG* zpl3M=9L;~f__(pVx^FXq%hOz`!rmvv>BrstrgO7Bqm{lkRxn9i9G6l&>+_m9O7NEs z_s4V2;@zPPJ^B9GwWUT2hYroY>s*n$`0%wn@Ui(EHeh+BkfoDG*sJ_@T8EWbZ7@2IS z_Uv{!(wuzW6^{ka6R;E`f9oSzNs&_ppMteUxUP7P$GeozZOf*x_>!|c)zDjaR-{nk z>>$(?(&~JSL>4w=IY-+SI;5rwSa+!(&{05gOY@oIyWG}}S?Z~@{*vUuP(oRL+R+U; zOIpQExW`8;%62?zNcU+8<-ReADa@-A+12~l5x-o9?e)3b3v9Q0DWXxy zZz_urz6qm%IGH@I`h++5Z-R}-y1@ao=IwKYiTd%o%puf?72=L^s?aeRS(3dnLTEZ( zhbd=%cA$Zi$kf`%LRGGrPf$ah2vbw}(PO@e;DGBwYe8(EWCXma1;~ztHym9W?jeWm z804GQA9eD_vTn(4`MG*vEsb)Td3(_+i3hh27;y-tf|!ub7?r0MOQ3)c#sR(Mi#foB zS|~ja_G&2%rz$q;wI&aq{)Ps1r~p!_md9WXlxH|_**GFqOVF)OqrLXO)<`M$2`VmtFgaI+c@C<8LMFp5Ea+v(D>_qO8zW&f>Lt9thc z-w5mVgZFYaNFN(sKPForH^$cOYJ4wS$3I+IE-{DQV@^|)u)1p< z8CA)fIRmbi797{3O%Lo=MOBu6xKdUb;waG>mvzdjU%`@-1y!g!#=BAY2}u)5C0E`( z7s(9snfzN7pSbB>;+@n(yfI$EfYDffc{V$XG`8Yol#Hwpr@=c@;rFJmztEavo4ZT= zc4RtT5pVe?dX%zqq#1L@P`#Fg8rtvi%OmsOM3pn5DI~%lZXEQj_#WH~aHNEMm|WJC z0wO>-LZit#PzIi;kA_>+MnF4-2A*g6F4>8AsF@q!Oe`2|suw9s25^kr^T#@@yDYvl z?bmP%8$xs3F8KJX=TZm!#D6kV^>ce)mLhF#2DyqK;LDuGtRF}6_;S+7J_v2E zOq~OSb;aP1t0L~*^PT}rVOfdfvbV0a`?F?2tIh=K3jSx6hXd5=XZil}px47|gCl8e zmy>i)trWYO%s)!X+8+vGpQ7acqFyyD3BEE)bo8QwzW?UzTA6FwAcT!Q_cY%CRS@oa zJ&5;>9dpCi zX{XOzY}^=p70<>fO`dayy~nt;1TO}ZFA!J5I|v6x_son`wYu!^49z?$CHTj9JOBF5 zOzk9v*8A%J6eh0?L6~$`f0t_V(aTwHkhoXm@|C z9Pn;`_nNX92ZOd7yKV*AfyO?1_XPqyOQ{-REtKfo{Y*E;i3{Oix(h%ZFvHn#U!0I?f7%npp&gsuPFD;*~VI(i~ zG2%x&Pdc(&l|qNG%f#R9Eb7CCVgKRiu$Qpd!GksnjLN=!UPe9|z@pU){DI@j;SVdm z3rtqM#n&t9Z_cd1-9nszDNWzvCTXAIvVN^`&8jvHUwpJ(zK%W+k||DwkgafMWB)_s zv_^g`qFDB%SP^DiCP%?KCoR5v|3$rvePkAuwn?(BZM+?Q2rQmQ?Z3CcqCX>~`gmd0 zS_yOf=N&I3D8Qq{H(teAM z)~i4O2n5cmFevGBx76K|#zfSueD5)lG0&>P9V6c*-H%2zgcy7`ypN=YkCyFM%DI!i zU(Qe8z2A6EFSjNpv@k|a(T6G=G4?rcZeoj+KaV_#7IJ5Q>^VUoL*t!N zk`_88A=2~yNIk_(Uv1)C4{QByQw5nXTpLn&?*gj997-;i$k!=rcMj1i(GL@;rR;sD- zz!Pa$_H=MJR&DF^s;c7=uLpg+T|`w{d(@V!St1%n24!Sl%G%MlTg8Impwjy;siGrq z<0T_i_7^+`E8{!HJ)NpYyOPr^RWryTl}IT+h;s+@1<*E6=-&LJTS!?NADO5VQ=8B{G`n@j*y%LW=t>svR2Td z+B2)p5SK;=|Crlny|hnz_);$yR2^Xx4lj-ZUlh0Uo-LGgG|^jpBs18`0|@0{-=y~v zdE=jd;3e{R?7E*o`K|F|;SPv<599>K4Y$R$@vG$B6U*+D(ve{ORLUq>eU$yp`Z1-z zp}O_f9_2&&sKQIGLK0j)-Q=WafQUs9?C(^&Mql?mFLh}z)ezZL6L<2q9AXRMb3CbE zT4_POr720BCC_lrHh;V6`~t0&1vCGZvkZjZxiSOCWYGvEBVw0Et)q*b^XfudS<%<* z-m{<6GrK9ouy-y8MS)-JDNc9kVF+j+SNnXz-B!v_Vhrm@+a29 z#NuDxw7+OlF=Nbivb{@_!-Wzc|I&Algsa+gOiGJ8a@6`G-Mybk1$&;T^e7_#MJ13_ZaCX4OWH=a$}trir%z zomaNa#mYx&#LJUbrn>*W-f%6rSfW$kwX!#pWsmFS$&NWHAW#K=cazb%i5=SIl0&{Y zhm7b{+sU$47e9)KuuS})*G>65|Q_pp!I*@qimt6%*my-~Df)D?B%RJ<6X5)38zQeJR ze_$fnk>Hk@czFC`2(0muNqSH>aZD2A^mEXx%B~#dQ?>_osvl+NCTK-px8{axaDltA zxH640KJ`1v{jmccRhS4Li=5I^jx`5vGFNpT2Fpj!^b==S{rwt0S7qfIMx0057E*}FTEdq(=?7o zFF0kaxuv}^0)YTc^n2m1*zHc^6xqGW|XL+m8!T>aYq7?_102S z%-vnGYgS_)UYnx<|6e=P&2W@7Q)yL`-xf)Ls>7WTYOMs9j~`k3PjTvA0#PEhMb#?f zDHdIl+v;2VvhKu*tshO3)e-tILf>OOX#;*SCr(;o^g;GfmRWHx#Yi#n_>JK#c0{VkQvGs7%CaAkD4$eFOuh}8;hC;p^d8jjxx*|uy?_Yap%H^;T}Qf{oT z3>I^SGO^H}le*)t*fzmeYX|mU;2h-`Uq)^xO1Gor%eP#q)5d3(Ay38(64n1kw7k_t zd}m+>5Pj<-P6uY)^`?;eH-Ulk)Y3K$wH36#475v;yQFel##RlqX(JAMbi<6D&8Fc+ zdoQ+h!m&9pc#um1{2Gg=)b@>WN8$tj{ns5~C-{#@XI_a>OEB>LsLbf~E7LU{<*wxV z;oYx49HuF}0A7l2G8>a>n5TUuwnq4X>COXls;Kk%P7>DnQTBW~rt^>Ux7W|xV!8#U zTage(Uag&;Qz6Segn&TRK0=xgTlShYEO;bV55Vjr_J8(Jo+S$$mf`|Khvc<2GbmUA zz33iP_srk@OxAD8ZQEi_+*AM~#c9?@5UE5Jz<71$M$|0gQmXug4DU#5jZNCZGC2qyYK#hS*qGEo%B#+ope;n1KO-s-X2Pf zk$vm|#7Cww#OVsX>gN+JT5s;5^+g>2PD|QFK;L5hC1>byZst3SR=?Ra3ew=qNjm_+ zgJ0gySJSP+ymy&Hxv<^V>GgC!cBuN=A$65aE9Z)TZZ(D^^>4ogvC(mC3j}Wyqb2RT zcNBU*7tyGvg7Od}Z0s6bJ(o&?eg zep*1lx6y+=+*~)7E|ieCyT7JC4AZmiU@WMpREYuk_pCZ4oW~nQZOrLCm9vSgyKFQV zXLcuN;sbSbQMta{spHV<27sn9E8t0DPY%axU~6pEt++Us($E0P&viIp^8>V=Vb8C- zRlBKmbBXr=^_4PWAZDvO4VIT2yLN)X+0aT6;rL=<>88#kjN4lNEE%D_z6?m~N(O0C~&S%#AlWhzKpn|?# z9N>B5GbX9o0UYH=51-Ew#W|#RbaMnyr!k+HhY^ZAR+Y-UOI4APEvn$#duwQ9)kEeF z`}ROxJ~K&w*iFt`7Zn5~vIaVbnAwUs=r9O+*BG`N?k5caPJN%L{#aY@ApXclX4$%C z(a?$O=b5<}^@;xmYbX$odfL(LeFA69GcM)T6B%TQMEZHsfe`{dJz99t&%>!R;3iAY z*fZu1-Bh!VG}e~U-Sx~fX}OeVH%cQ8^Y{v8`EFiTO5g87n&h|S9kKgJi!2xy{6m5K zGDYz<{1Z=7AA6g<2TGNrtPS4C23wQJEQHQNuv*4DpM~sper~;YbA7itd@Rr3grU|m zLFHGl7^0L#hf|TD97L|q^01!9JM~BH)he2b54(r{Y3qdLIh~^bl`~}s0p$jgUGUgj zpfL`emi9};iDrb6!#bSjaJ#MWIKRK=81vjn={7F(b=FelKiaJX*;A#41~+kLW4R{j z1r&*9A-)gG3JX#K$F_p5pO>J}V++8ktN#IMZY0_Vc9X1PELuG(gG9BY zj4Wo>orcRD>Sy;5a%DMv2~egas9iJOSK&yd?4Q3rXSWyqITC~*Mj>ZwZ=JLGjwICs zCfYxY{FSBO+y+djBAaiD!5G7KTNW`J>AsqW1;Ud$up+ksd{bfuh!D$28rC`1hzMu= zwP;wdLFO?D^ATEN899U|1pD*iO8y(Ta1$^dp3Du%Y23(0yr1ox=GAV4b@Rj!JqX~K znN{M&+R{g{9oT;w(q$CxHK_N)!OxcTbH~|swm4wwJaU7o4w^k(Fh?-$(!-Z^P^(_| z7Hd5+Pcnr$?Oi~@y|;nfvwhs;BRvNf|7rq%h9$f2i9YFQYS9b%1U#|b^bTHoB%zOw z3_52JzL(z*^0if6X1r^=v)aJN^=_wR+xb+S#=g#46|O{}H5o;;HzBed#@Y8cy&UeQ zV=~d;T+WH{VJek>ekDsxB1?3E13x_0;g4=nnzFg}yC`CBk$bWmm&LOkfNXDVgpR`1>5|NQ-LpU)xarGb{6soJm8J;5YQ z72}mN^}mgdwWQh(yD4t{hrOpIXa73zeur9tP`qD>!+$`So}HB`o~rtcZ)39h84A#p z0MX%2voJ=^YB=Cf(-It8|4p^Q;NNqGwOYg&1Vr3i2X3d_IDaeN0&16ko_RN_XEsnqJ1^`)SKTyU=W+D zfs~wMq<|FDyTHEBL3ffsv+SF_hDqKn#MmMo)8CtdO64If@B+A;mT!$ltZ5jEP{9in zjJnTH1~cZ2^B?#=ug|%s(!dz>&aBXK_md@5c>Z;VMkoD;U0W@T-jk(uB!}$>9I$D& zsU_h5r?Inut)p4?yqTGq8IB!e%*@Qpj+vR+j+rrL#~3poGjohFGehiSW?X+yyZ7!s zy(?{xrbnaEzj{hFqgJ<6^}C^;#yNX_2lKjY)qBB9LUD62g=J>LF81XV>5T#1j>0rv zXfC2%LNhA9bUPpE#XG0k(mNt({6vCaRng$>JY=^kzWE5h735l`@iS?*t!QGBp$M9BYEct;tZb`A zXplA%%d!%!)9eD%%im7p_e~bad;hQ?d}wo%Udl{Cflcx;JKP=DZicO?$Ynpe$5$aA z*Jw3QB&is&YZ2j(^tQ>RT8Mr+52RcVs-Mp=P<|T(+b2he;8$}{OxSf0WfQEqk;G0B z6+yNk-E{LXK__MOeJ68}R3?JtG|pS=crc&Y$ItL^qv)NanIJO` z>tuz~pbQofhAD-vs*d%dmuNT*kBqBwyK~NrqO)*0Sp6lMb2VIt0O6ZW+a<6LkSW`B zPoU!ky!_90Ku6*5Mu&o%{-3gsFrkU~I$fZrsqPwftuoM)wt3J0Ab#V%qul$dJuH+A zb~1IBqx7NtH7Q?;>wH~Ut-0402q+iOY*x*@scYjYnHT6l&fsX$Cg?C2EEXAqhL9JX zr})y{Eo+gJhiDH1857~4Y(WZf5o1Tab#Ms3i0FiZ!SB%|BB}T5EWxK0Qp1`3p2W)= z5?IEjndgh9B!X&m0v7BhftIz@n)Vs#e9(x>BoPohY08=0DBmB1a_?J*xg(gMapN%( z`?L%qukVO^?Vib1`QDs)M-*2YFKkWSvUkz6S-{x&8ht(HK8NsI*rO@ULl*Cb95~ zNz>tyy1&2m=>Qi-#yS3%S=l3c9&TJoW=VPP zeLK11ZVY>x^vq0@NZ`sYo;3bS$il9)r8o~NMX8Edu^;})YjBdcESxvW0Oc!uZDaX0 zId(9kvYv($zWh^kc-%9}(d8_Su1nLbr5#0JL^Um*>i+8*ej7CIC>@I21Tlb!?~Ly5 zdZZzFZFd%Iu-GMjbg|KY+GUj*`kQMB0~^CaHIqCoLb8~F^pKgVjCc&H5pjZwaEc(c zn195X;vr1Fn69GGwZKD#QDE`=<2T)}?{j&##eTbJ;OIr}qcLI$7~HE7jP*+P39Urx z8?N>VwpiCH4};iyq1CjORT32q;QrfnW{6=>|;P0}# z_s8$ccQxas>t(F7!Y_yT47eVCZ_i){9>}We`S)V>xw+F(k zlcL{xHe%Kh8(qE8`Rd$hTm#~TZlJfr4UF+W$*3`Q^>h z#7$oa{2eHiHf%5#KU_Eky3V;~9XFb)mFW9?^sqbM-e$&Nx~Ju|oLzEEOsRp`m}Y~G zhx`sDPRQwV1jFUOhy&qi~$l1s*(#4kk%%$pzo>pDDWU}TB_&x$60H014@?f zemg{5*0_o-{ve+JLsFe)51XmEgxftmsJdtNApYK^DftonY(6iLlpi=wr5Ec}9S-IHk z+G6|4&0Yh$b{Z{m8J)kRv|ft7MFSgA0tn)|1UP3UP zAXWu&vyrWy$r%_ib@MRC$8ggCe}`(DN_+_!j(#IOcMsTm+nuT_#WG_uUShGZaja4k zl0x@<6h1&gnlK;lR##_PDK&A?3th7F?~XvuDBP$TRfWnra?%L%JeFUC{rzT5a+)0o z?p@L|aHICh6B{EBsR_mBN)ukS8it`?m7P$dyKHQsXQ#toZ_rkq=i;F-Qf>FJ;5Fo$ zOr;7FPhu_EBQR<1Z<5*XeCAMwyLhl&f#$2 z?0uDSc`tm}#~LlVgX?Ha17K`RxDx#A3YqbN>)Kqd52mx4d;`^EG5yrnvR7Vu>7#dv zrc0HOTgG7H1pbaV8Yk8>)4B_Dkv1mH8$~ODTRWjgo|k@g zTdT)GtaAs}(>R@mNH+C8?)I)!ovRi2#S$H0vNeXBH(b$4Noh zMIULu1|rSNYyW2^!5?O6EX(tlGQ~nIDOY_D1 zf{3H3r=UBvIHO&XK(;1Ld}avfa%Ea2o*FF$H2>~~I#42iA`}x>n_AaVSyT`MTfs!z zw9fUq&t+NxohB}nzX!#EXmFg%+!2Btb%|*3X$Dl9&Fye7V^QP9h?rfs3pjQWmem+% zAg>{or)m9up_K9TdwKFUXum$7(1rNW(pLxTa>T6<&8icn|Bz(|LURci1SQ^koIHIk z$dDM2RzIX}qMb}_b|r`g-a2GRns$p}Cb^stfgs9#S3(rN;yLrj4x1v8*vq`ufsg%+ zm6*Sf%Y>E3$K4-0FtDs=K@gP^9S(yTFlW01;kO`+>5pnuDT`hja)Nr${e^R6b)Y^# zb9Fdp$B}U-DAg)eAQu_-gz|9JOFfPxN_?nAPjRSGXTO;FN46VCY=+CacWvB$WyA5?098 z-zMXyMhwc!6)vovYJf#MWYq%}!_kKIdpfG`4nG0{h?8Y_jtXR>4wRM%>4{c+5dCbb7y zR%R=Yj{Ddj?+9VEn_5I3{J`ZR-dYCFJYnjIX=6)%VDFny7Ur<%ZF76twtRjL7fRYU zSEolAdy}e_C5R0R5f9d}c0AfZ1tPJ{omkJB%t>dqtYZs)IG#29mK_LlZGA=nAv3>1 zku-u{c9o(z?KF3~gQ33deC;Y2^ijzyM?eNb$Mu11lJY<)!}P&{^;0mvkB|R=ocnQo z^A0j4GRu-Eosx|6y~?A_tftjE5J(&}e3(>f$@CqSvnKpUs*GX`w~_Pj`gULeAmj%T z*kd`4Or)#n{v7}DQ!JVdIB{R(C8gS#^g!H=GmUY=_e{Ur_mHa&_WW^-L$`L*jWZIG zI2M5|8k;Omqai&QE9bCB9lFtsuZOE&=(#fcC5P3g_}xkQ5p+Paeyb(UA?&HQBJb=L z*!`aEaLeO*-~>kF3}t4mHcGc$p55kVR$N;0H9!w@Y7Uew6(3rRLJs=(Cu zXT46wzxy|BCIuHbmaeq4L*s-N>%n}Zku-P0#m33@3zERtIxVc@VO8DdsIGLCjOxiU zjIBXNDE)p)k#6@ND=5Vzfw z{nh(P0mnFWw6Rd*=R~JbCq;s|Du@@o;P16cIuEM61`BMNqpPVDRVea3yBAwA#!*=T&oSGEio<>ga(Wh60{QN)ZxX9s z8l8=pI+X%eEm;b>ap^K9%T4PuW?pF+uYYA{RDO6qkI-LH{-k{JY26pZ$)Jk!7T|v_ z_LSZVwS1d+F}wG;4Z@&NVs(*Zhp}l`q=~w>onj9`S)46|`tndj`w~BX0F_N_P=tV-<)Le!ljIt9B=^brEC%=BR z`Qf)X4pC0}lj3e0v;w=PR+fI>+{{Cy?%hT0nO%%C|2 zvJh^@DyL`y0%xU|JiFGg6a7x~7+)j{@cA3Zm{Mdv3xzoX`7K zLSgZfCZRo?`u5IFSJaU530>65^`0=kfm8*Ld@lx``Bv!m`{`!h-^@^;vQ|X0Slyde z(!RkN7Yyk_8McmyUFoGlwIJcdNh=ekFE&US!%g(t{Q;?vqqdOhFT;S_!`}RXkfM71 zUiIpb$HeY8yh06;#yNs}Fn@8U1NdJx{mt2^_J)kXbkH>lyE_(SKrAKpdlfM?{P&>QMjn=STx-?b&>4dWt=Bf0JdEBRSrpdykPw)W~U(g zqBbW^zE|`G-CAcBsnhlx3;rcZLB;2EOpa-P2p-`Xmey3|3W<{8C5u3Js_7Yf@SFB8 zb3O5dy67z(UPBCzu9=gX&B6!`>1*Qj@5EBjv&+~Ndss$+}M2l;N z1PZb)X#^oPbQ-2fNbgu=t7<)W)byF|({DDZD}8p>mHnc|z9WxRdVApTUN4w?p=y=( zBOO6a$qSCT#x`H2Mrr+cMHf_ds9vC@sB2WPUdKHi3-4?4f0$41dE_&VMa`=q@ z;r()@qlYZwU9DfrY?+9dNRd6(*a!rx?bxY?F93j`*qKF7wcF;wC+CiqHgi|MafPldIdgB)u{3$0rqkM2cuapm@DOV)MS-4 ztwrkmS2c3v#uN*{| zr6fnv<7gt5lB(bP)fE0J<;?-nK$Pm32V41J8l+sxYkT9Hq=f|De`@%y$MKzZ$)UHUw!|eK+i|dT=L~@JmJXq5mDzmFOJYdY>D6&e&5aV zyn3E#8h^AqFo;CrG_o|{b+KQEcFPN07-x~c5Ms6kFUiJ^=$)-M!{AD=&at-l?9RW~ zg$gFas+8>^*S&0bZ~rtw^Kj#8CF}^kIb6HbLIXnT{+5j=bWjELH~J>2Ke4B@!R)v-eNF9PsQFbG;9NMAK%;~qxTr!j; zg@S7`_(4+SB+Qi^TsnjBtLc4N#Ru_4%>guH(O=?STC&hPFyh`aK9iwb-Smu{%Vq1_ z%R_HD6shtIh`7k7q*Ek6IoV6PsH9GbPI>-j&vBk}uez)CT2M>TZR?vIhJFPLvafp? zZFCuFuKRlRdyeA({#Y`VTdg}AF(|wr!%8m?K0(gI!|(X&Og^3CkLiwzl z4s)I9AIPKJRjDMgJpN2-Q|!m^qDuv9Bkkq;rYG)yw2oemY*&QmI(Mtx(ce=h91O99 zPDwXtQ`B-(3a!f;U=;1clxp0%NmcCCQVqzWxxhk4Jz||Np$SQa#!}9Okl6wc0i>K)pLkbrsLQVsPsJyVNB4dWh)($e8?Hb zNrFoTRVGakNn<0weG z-zYFzvRQa3`x6vhO}%@WpJIp zCBdr{eTCZWP-h~=55n_#2tKeVfaY#Q5{vu?0K_LrovzBihC6>9$XRgTo8As7-pS6f z+Cd3Cw7w66_=ySG>N{5Bqp;z6v^usYf8ST8 z1b%6g#!sH1dd>-iZs~%GNpV$Q?P^F_cnsS2%Jj7k3@#cvBlCSm#N^}Ajc-h9jnZH` z`;9cCWC0{N>EDBT1Qc8N`u64+7KG+()948bcD%cv0P0VHh}~gzC}un_KAV)?K&XLS zJnHKO=%x)m+1YI|P#bY|*1j*iaQB_Vo|uF!f4SPy*RFdluI~2?H5$2Ec}6Zq$s%k* zbL974>;71nTI56f9%c8&gX~TJ^RDboYUKgn@b%W7g@uZ%YW6X5ruy~8*mf@_+&Wy# z{c|ZJ5;22fkjxSW0%{39G{KEbHZ}*ZGPREBw5;m^- z-1l>uu^EkMRyD+c%s23NKE>$Zd{g7?TB9+&o5}WsH0Di34_M^pJFS7kHX-kwS(J9%J?TAEVv!#-=Au12VQS6<&+5z$0+R%D;zI_9C4-HrOqJQ15Pcq@?%z3 zH|YKd7npT7*in=xBqp=oDMru!ReJ+dxynCLI4vb!K|P2XD`h`&@e1rEer(JCt6zvt zdvzu-MCWd3EK`jUxIb%W@tfJe{mt7(PI-KINDci?vsI_eT3vX%ybUa8kqiumQ!~N zMc{!qTCYYXwIj&EQ;db-6R4ya!@1rfPY8#zjHE#fHH^|Gs;vvv|IAK<=kf>g}Ayha}iIl{wb%; z50CNq@Q^SbrCQ@>ES_)HBTi)So9B$y8(*$Vr676E#pT3GLlrBG1O%i2OUP|-71~^3 zGW&6Z)p2(GU^VtIzJ_=D?8-ze4J7PypIca@HE+#*{64W{u^x?35-&*13x^(-Z}y1o z%*!Kd@nY@Mw=8s?=D{Ajwus~(V>I7RsG`gVoo*eqxRz(>k|2A1@WSI=aSF$axreUMG+%DGzV!Lwto<1@fdj4Kei zI&jGa#ZBC|$#z9H5P%gb#G!8a($WBFqt_l_me!@A8kL0SyUsSJi1RQI)Z_S2ahIXQ z;87X6*74f7JKzJK=e|bhp+yOi*(=d#*6HaZ_HzVr*SzYxtOC`I{Q!(a?DWQ+viHyw zv1ut#O))+}={}B-FrTmZ{`@!MDNveG5Udx@$<%cu=ir{jRr@6H)*EO}-EEr(ge}~d z+7Df*=GqZ{q0UZ%efxsC1@K?ST|zRfH3U{dZ$tF9a$LJ0+53nmEB%lumPi1tPcXtI z22ZH>JnGe}7g%UG9;}_*s?BXzW-u#V#;jaU*lE@J5xSMjI_|{cDSkT{_kX+o`c#$N z%Ly$~Li-}d_md}t2{FRv5~rAG&e~>+BV<}F~_mIZ?0h+bvLgVIfC z_f^W#wXUu2(9{g@(M&?fWv)MrExXhP2F;UYRjiOkq3JR?M3#qZhF=^x0o-S~79V^8 zAai9O>vvgbCPI%I67y-%x}0oMTrxXTN%sp$C8zGsl~V!Drhrg0c$oOsAoaGo1MJ3e z4Zkx_u-UQOZ1a>ezzo6i1~VeLye+j9j4zOM<;@|HCrJc_u|PPJWUmU-J^D4rzXnjJ zWlm&~U|1WpG?*7QP_z~jgKM+I(G$(N_Hf!n#5vy!tqhXUJhs?%V8r-=q3eD%x0}O= z>%Qr#g5vG+4vS!jeJw4)6JFRpT7yJJ}@ z<%CIDAK9>5pmCfI@YL*q`eDI^p8`ikm>Z3pr@e{ej}(7sy<%W2G)ru*cV_n7n>fiT)iNe9s8ujJ={+Fvnt7bDp*oDg{nR;h zO7O6~2fbvkns@xcKDC=+C#DGT=JDo9eC^i56akqB7clGOyn1kYHs!SUB>-h4ZG#8V zLgsi*%&LGUl@;k&IJAl7j+6o*6XA9O&72x%K#K)?wpyL8n`HOUzU#U+KMDD8Qdu=H zV(0?iN;YehZl4A5b6mf7`}&YKojR+pUR0uxyDcbTG+!!$+fMuYHy+%Y#Fk}N&;9<5 zd)Bh>K7Mfeg7KgtbNvyJds3r>dEmfi8a{+ujnJ)@Iq0y5r1WLWNA}xE1=2!?ye)8< zPHH(9y)CKj>8&-4L1esf6Vjj!eTl!xJ-u0(^528DtlG=&O&g3mwWMJI^Y8fy|Sw+KY?uYQT$Y4IZ5Fw0s;b0jHQVW zsQI*NZjXz;Cl$+x`c{Jzc&g_|p%lDEF z-t?-L5}r0mRS0N}M6K87sEwie!c7D&nXNzzZ(f0`+nyO(AcVNg1B{1@FI$ zkBPBm)9n@E40<$Cltkt;Sn?VSV{M?4`{kD3eapTS{N5N^#X7Od=#n&Ou7#1)2Epx+ z)(CZrlRH{(V+!g+-s?nlkQ*&s&dDV9k%p89(@gu~TEcZ5>tFP3rFsHU3+JQxNzh1H z4jcjt>_3w`J{|dNXkZ^A|6KpY@%aB0QGbg5#r60@6YjpX8+v%FF*z&v;Y7A literal 0 HcmV?d00001 diff --git a/q2_1.py .py b/q2_1.py .py new file mode 100644 index 0000000..8f37e33 --- /dev/null +++ b/q2_1.py .py @@ -0,0 +1,74 @@ +import requests +import json +from bs4 import BeautifulSoup + +# 题目强制要求请求头 +url = "https://exam.detr.top/exam-b/movies" +headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" +} + +# 仅一次请求,符合题目要求 +resp = requests.get(url, headers=headers) +resp.encoding = "utf-8" +html_text = resp.text + +# 保存原始网页 movies.html +with open("movies.html", "w", encoding="utf-8") as f: + f.write(html_text) +print("✅ 已保存网页源码 movies.html") + +# 优先尝试直接解析接口JSON(接口真实返回格式) +movie_list = [] +data_id = None +try: + api_data = json.loads(html_text) + data_id = api_data.get("data_id") + movie_list = api_data.get("movies", []) + print("✅ 识别为JSON接口,直接读取数据") +except json.JSONDecodeError: + # 若为HTML表格页面,执行原bs4解析逻辑 + print("识别为HTML表格页面,使用BeautifulSoup解析") + soup = BeautifulSoup(html_text, "html.parser") + # 提取页面data_id + if soup.body and "data-id" in soup.body.attrs: + data_id = soup.body["data-id"] + # 提取表格行 + all_tr = soup.find_all("tr") + for tr in all_tr[1:]: + td_list = tr.find_all("td") + if len(td_list) >= 8: + # 增加类型转换容错 + def safe_int(txt): + try: + return int(txt.strip()) + except: + return 0 + def safe_float(txt): + try: + return float(txt.strip()) + except: + return 0.0 + movie = { + "id": safe_int(td_list[0].get_text()), + "title": td_list[1].get_text(strip=True), + "director": td_list[2].get_text(strip=True), + "year": safe_int(td_list[3].get_text()), + "rating": safe_float(td_list[4].get_text()), + "duration": safe_int(td_list[5].get_text()), + "genre": td_list[6].get_text(strip=True), + "actors_count": safe_int(td_list[7].get_text()) + } + movie_list.append(movie) + +print(f"页面data_id: {data_id}") +print(f"一共抓取到 {len(movie_list)} 部电影") + +# 组装并保存 movies.json +save_data = { + "data_id": data_id, + "movies": movie_list +} +with open("movies.json", "w", encoding="utf-8") as f: + json.dump(save_data, f, ensure_ascii=False, indent=2) +print("✅ movies.json 写入完成") \ No newline at end of file diff --git a/q2_2.py .py b/q2_2.py .py new file mode 100644 index 0000000..436ed44 --- /dev/null +++ b/q2_2.py .py @@ -0,0 +1,38 @@ +import json + +# 读取生成好的电影文件 +with open("movies.json", "r", encoding="utf-8") as f: + data = json.load(f) +movie_list = data["movies"] + +if len(movie_list) == 0: + print("❌ 未抓取到任何电影数据,请先运行pachong.py!") +else: + # ① 找出评分最高、最低电影 + sorted_movies = sorted(movie_list, key=lambda x: x["rating"]) + lowest_movie = sorted_movies[0] + highest_movie = sorted_movies[-1] + print("\n① 评分最高&最低电影:") + print(f"评分最低:{lowest_movie['title']} {lowest_movie['rating']}") + print(f"评分最高:{highest_movie['title']} {highest_movie['rating']}") + + # ② 统计各类型电影数量(字典输出) + genre_count = {} + for m in movie_list: + g = m["genre"] + genre_count[g] = genre_count.get(g, 0) + 1 + print("\n② 各类型电影数量:", genre_count) + + # ③ 统计各导演电影数量(字典输出) + director_count = {} + for m in movie_list: + d = m["director"] + director_count[d] = director_count.get(d, 0) + 1 + print("\n③ 各导演电影数量:", director_count) + + # ④ 统计2020年(含)以后上映电影 + count_2020 = 0 + for m in movie_list: + if m["year"] >= 2020: + count_2020 += 1 + print(f"\n④ 2020年(含)后上映电影总数:{count_2020}") \ No newline at end of file