문서 인코딩
문서 인코딩은 애플리케이션(컴퓨터의 운영체제이든, 직접 만든 파이썬 코드이든)이 그 문서를 읽는 방법을 지정합니다. 인코딩은 보통 파일 확장자에서 추론할 수 있지만, 파일 확장자가 꼭 인코딩에 따라 정해지는 것은 아닙니다.
모든 문서는 근본적으로 0과 1로 인코드 되어있습니다. 인코딩 알고리즘은 그 위에서 글자 하나에 몇 비트인지, 이미지 파일이라면 각 픽셀에 몇 비트를 써서 색깔을 나타내는지 정의합니다. 그 위에 다시 PNG 파일 처럼 압축이나 기타 공간을 절약하는 알고리즘이 있을 수 있습니다.
텍스트, CSV, PDF, 워드 문서는 모두 기본적으로 텍스트 파일을 저장하는 파일 형식입니다.
텍스트
대부분의 기본적인 텍스트 문서, http://www.pythonscraping.com/pages/warandpeace/chapter1.txt의 연습용 파일 같은 경우에는 다음 방법을 쓸 수 있습니다.
from urllib.request import urlopen
textPage = urlopen('http://www.pythonscraping.com/',
'pages/warandpeace/chapter1.txt')
print(textPage.read())
일반적으로 urlopen으로 페이지를 가져오면 BeautrifulSoup 객체로 바꿔서 HTML로 파싱합니다. 여기서는 파싱할 HTML이 없으므로 효율적이지 않으므로 필요없습니다.
일단 텍스트 파일을 문자열로 읽으면 파이썬에서 다른 문자열을 다루듯 분석할 수 있습니다. 물론 여기에는 단서로 쓸 HTML 태그가 없으므로, 실제 필요한 텍스트와 쓸모없는 텍스트를 구분하기가 쉽지 않습니다. 이런 점이 텍스트 파일에서 정보를 추출할 때 부딪히는 어려운 문제입니다.
텍스트 인코딩의 역사
- ASCⅡ: 1960년대 만들어졌으며, 7을 저장하기위해 저장공간을 낭비하는 등의 단점이 있으며 기본적으로 영어를 표시할 수 있습니다.
- UTF-8: 1990년대 영어 이외의 다른 언어도 표시하기 위해 만들어졌습니다.
- ISO: 각 언어에 특화된 인코딩을 만들어 ASCⅡ코드를 벗어나는 문서를 사용할 경우 저장공간을 많이 차지하는 문제를 해결하려 고안됐습니다.
파이썬 코드에서는 명시적으로 인코딩 방식을 다음과 같이 지정해 줄 수 있습니다.
from urllib.request import urlopen
textPage = urlopen('http://www.pythonscraping.com/pages/,
'warandpeace/chapter1-ru.txt')
print(str(textPage.read(), 'utr-8'))
이 개념을 BeautifulSoup와 파이썬 3.X에 적용한 코드는 다음과 같습니다.
html = urlopen('http://en.wikipedia.org/wiki/Python_(programming_lauguage)')
bs = BeautifulSoup(html, 'html.parser')
content = bs.find('div', {'id':'mw-content-text'}).get_text()
content = bytes(content, 'UTF-8')
content = content.decode('UTF-8')
CSV
파이썬에선 CSV 파일을 온벽하게 읽고 쓸 수 있는 csv 라이브러리(https://docs/python.org/3.4/library/csv.html)가 있습니다.
CSV 파일 읽기
csv 파일이 로컬에 없을 경우 다음 세가지 방법을 고려해볼 수 있습니다.
- 원하는 파일을 직접 내려받은 후 파이썬에 그 파일의 위치를 알려주는 방법
-> 쉽게 메모리에서 처리할 수 있지만, 하드디스크에 파일을 저장하는 건 좋지 않는 습관입니다.
- 파일을 내려받는 파이썬 스크립트를 작성해서 읽고, (원한다면) 삭제하는 방법
- 파일을 문자열 형식으로 읽은 후 StringIO 객체로 바꿔서 파일처럼 다루는 방법
-> 파일을 문자열로 읽고 객체로 바꿔서 파이썬이 파일처럼 다루게 하는 방법이 더 좋습니다.
- 다음 스크립트는 인터넷에서 CSV 파일을 가져와서 행 단위로 출력합니다.
from urllib.request import urlopen from io import StringIO import csv
url = 'http://pythonscraping.com/files/MontyPythonAlbums.csv'
data = urlopen(url).read().decode('asccii', 'ignore')
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
dictReader = csv.DictReader(datafile) -> 각 행을 리스트객체가 아닌 딕셔너리 객체로 반환
for row in csvReader:
print(row)
'IT > Scraping' 카테고리의 다른 글
지저분한 데이터 정리하기: 코드에서 정리 (0) | 2025.02.20 |
---|---|
문서읽기: PDF, 워드와 .doxs (0) | 2025.02.18 |
웹 크롤러 모델: 여러 페이지 유형 크롤러 그리고 좋은 웹크로러 (0) | 2025.02.16 |
웹 크롤링 모델: 링크를 통한 사이트 크롤링 (0) | 2025.02.16 |
웹 크롤러 모델: 검색을 통한 사이트 크롤링 (0) | 2025.02.14 |