-
ํ์ด์ฌ ๋ค์ด๋ก๋์ ํ์ผ๋ช ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ, ๋ฌธ์ ์ธ์ฝ๋ฉSoliloquy 2022. 6. 22. 01:38
๐
๋ค์ด๋ก๋ ์ ์๋ฒ๋ก๋ถํฐ ํ์ผ๋ช ์ ๊ฐ์ ธ์ค๋๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ์์ด ์๋ค. ์ธํฐ๋ท ์ฃผ์์ ๋๋ถ๋ถ์ ๊ฐ์ง๊ณ ์ถ๋ก ํ๊ฑฐ๋, ์๋ต ํค๋์ Content-Disposition์ด๋ผ๋ ๋ถ๋ถ์ ๋ณด๊ฑฐ๋ ์๋๋ฉด HTML5์ ์๋ Download ํ๊ทธ๋ฅผ ์ฐ๊ฑฐ๋ ๋ฑ์ด ์๋ค.
์๋ก ์ด๋ฏธ์ง ์ฃผ์๊ฐ ์๋์ ๊ฐ๋ค๋ฉด URL์ ๋ง์ง๋ง ๋ถ๋ถ์ธ Windows_logo_and_wordmark_-_2021.svg๋ฅผ ๋ณด๊ณ ์ด ๋ถ๋ถ์ด ํ์ผ๋ช ์์ ์ ์ถํ ์ ์๋ค. ๋ํ, ์๋์ ๊ฐ์ด ์๋ต ํค๋์ Content-Disposition ๋ถ๋ถ์ filename๋ถ๋ถ์ ๋ณด์๋ ์ ์ ์๋ค.
https://blog.kakaocdn.net/dn/bI5PaW/btrozw3Udj4/o2nI0pKMfL4l5ZiuFIUTpK/Windows_logo_and_wordmark_-_2021.svg?attach=1&knm=tfile.svg
๋ค์ด๋ก๋ ํ์ผ ์ฃผ์ ์์
content-disposition ์์ ์ด ์ค content-disposition์ผ๋ก ํ์ผ ๋ช ์ ์ ์ ์๋ค๋ฉด ํ์ด์ฌ์ urllib์ request.urlopen(url).headers.get_filename()์ ์ด์ฉํ์ฌ ํ์ผ ์ ๋ชฉ์ ๋ฐ์์ฌ ์ ์๋ค.
from urllib import request downloadURL = "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.4.2/npp.8.4.2.Installer.arm64.exe" urlOpen = request.urlopen(downloadURL) fileName = urlOpen.headers.get_filename() print(fileName) > npp.8.4.2.Installer.arm64.exe
๊ทธ๋ฐ๋ฐ headers.get_filename()์ ํตํด ํ์ผ ์ ๋ชฉ์ ๋ถ๋ฌ์ค๋ฉด ํ์ผ๋ช ์ด ๊นจ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฒ์ ๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ์ธ data.go.kr์์ CSV ํ์ผ์ ๋ฐ์์ฌ ๋ ๊ทธ๋ฌ๋ค. ๋ด๊ฐ ๋ณด๋ ค๋ ์ ๋ณด๋ ๋๊ตฌ๋์์ฒ ๋๊ณต์ฌ_2ํธ์ ์ด์ฐจ์๊ฐํ์ CSV ๋ฐ์ดํฐ์๋๋ฐ, ์น ๋ธ๋ผ์ฐ์ ์์์๋ ๋ค๋ฅด๊ฒ ํ์ด์ฌ์ urllib ๋ชจ๋์ ์จ์ ํ ํ์ผ๋ช ์ ๋ณด์ฌ์ฃผ์ง ๋ชปํ๋ค.
ํ์ด์ดํญ์ค์์ ํ์ผ ๋ค์ด๋ก๋๋ฅผ ํ๋ ๋ชจ์ต from urllib import request downloadURL = "https://www.data.go.kr/cmm/cmm/fileDownload.do?atchFileId=FILE_000000002535606&fileDetailSn=1&insertDataPrcus=N" urlOpen = request.urlopen(downloadURL) fileName = urlOpen.headers.get_filename() print(fileName) รซยยรชยตยฌรซยยรฌยยรฌยฒ รซยยรชยณยตรฌยยฌ_2รญยยธรฌย รฌยยดรฌยฐยจรฌยยรชยฐยรญยย_20220430.csv
ํ์ด์ฌ์ผ๋ก ๋ณธ ๋ชจ์ต ํ์ผ๋ช ์ด ๊นจ์ ธ์๋ค
์ธ์ฝ๋ฉ์ด ๋ฌธ์ ์๊ฒ ๊ฑฐ๋ ํด์ ํ๊ตญ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ธ euc-kr๋ก ์ธ์ฝ๋ฉ ์ค์ ์ ํด๋ณด์๋๋ฐ, ์ค๋ฅ๊ฐ ๋์๋ค. ๊ทธ๋์ ์ข ๋ ์ฐพ์๋ณด์๋ณด๊ธฐ๋ก ํ๋ค. ํค๋ ๋ถ๋ถ์๋ Content-Disposition: =?utf-8?b ๊ตฌ๋ฌธ์ด ์์ด์ UTF-8์ธ ์ค ์์๋๋ฐ, ์๋ ๋ฏํ๋ค. ๋์ฒด ๋ญ๊น...
>>>fileName.encode('euc-kr') Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> fileName.encode('euc-kr') UnicodeEncodeError: 'euc_kr' codec can't encode character '\xeb' in position 0: illegal multibyte sequence
๊ทธ๋ฌ๋ค๊ฐ ์ธํฐ๋ท์์ Universal Cyrillic decoder๋ผ๋ ์น ํ์ด์ง๋ฅผ ์ฐพ์๋ค. ์ด ์ฌ์ดํธ๋ ๋ค์์ ์ ๋ ฅํ ๋ฌธ์๋ฅผ ๋ค์ํ ์ธ์ฝ๋ฉ์ผ๋ก ๋ณผ ์ ์๋ ๋ฉ๋ด๊ฐ ์์๋ค. 1
๊ทธ๋ฐ๋ฐ ํด๋น ๋ฌธ์๊ฐ ์ด๋ค ์ธ์ฝ๋ฉ์ผ๋ก ๋์ด ์๋์ง๋ ๋ณด์ฌ์ฃผ์ง ์์๋ค. ํน์๋ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ธ์ฝ๋ฉ ์ข ๋ฅ๊ฐ ๋ฌด์์ธ์ง ์ ํ์์ง ์์๊น ํด์ ๋ดค๋๋ฐ, ๋คํํ๋ ์์๋ค. ISO-8859-1๊ฐ ์ ๋ต์ด์๋ค. ํ์ด์ฌ์์ .encode('ISO-8859-1').decode('UTF-8')์ ์คํํ๋๋ ๋ด๊ฐ ๋ฐ๋ผ๋ ํ์ผ๋ช ์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋จ์ ํ์ธํ ์ ์์๋ค.
Universal Cyrillic Decoder ์น ํ์ด์ง ํ๋ฉด๊ณผ ๊ฐ๋ฐ์ ๋๊ตฌ ํ๋ฉด >>> fileName.encode('ISO-8859-1').decode('UTF-8') '๋๊ตฌ๋์์ฒ ๋๊ณต์ฌ_2ํธ์ ์ด์ฐจ์๊ฐํ_20220430.csv'
์ ISO-8859-1๋ก ์ธ์ฝ๋ฉ์ ํ๋ค๊ฐ ๋ค์ ๋์ฝ๋ฉํ๋ฉด ์ ๋ณด์ด๋ ๊ฒ์ผ๊น? urllib ์ธ์ฝ๋ฉ ๊ธฐ๋ณธ ๊ฐ์ด ISO-8859-1์ด๋ผ์ ๊ทธ๋ฐ ๊ฒ์ผ๊น? ์๋๋ฉด ์๋ฒ ์ธก์์ ํ์ผ๋ช ์ ISO-8859-1 ํ์์ผ๋ก ๋ง๋ ๋ค์ ๋ณด๋ด๋ ๊ฒ์ผ๊น? ๋์ค์ ์๊ฐ๋๋ฉด ์ฐพ์๋ด์ผ๊ฒ ๋ค.
- ํ ๋ฒ ๋ณํ ๋ฒํผ์ ๋๋ ค์ผ ํด๋น ๋ฉ๋ด๊ฐ ์๊ธด๋ค. [๋ณธ๋ฌธ์ผ๋ก]