• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

이번강좌 숙제 문의

18.03.20 16:38 작성 조회수 77

0

안녕하세요^^ 항상좋은 강좌 감사합니다.

이번 숙제로 내주신 거 하다가 에러가 나는데^^;; 잘모르겠습니다. 기존 추천 강좌에서 img_list = soup.select("ul.slides")[0] 이부분 가져오는데 평점순은img_list = soup.select("ul.slides")[1],학생수순은 img_list = soup.select("ul.slides")[2] 인덱스를 이용하면 다 가져올거같은데요.

우선 인덱스 순으로 img_list = soup.select("ul.slides")[2] 이렇게 하면 잘가져오는데

평점순 img_list = soup.select("ul.slides")[1] 인덱스 '1'을 사용하면 에러가 납니다.

==== 원본 소스 ===

import sys

import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')

sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

import os

import urllib.request as req

from bs4 import BeautifulSoup as be

import urllib.parse as rep

base = "https://www.inflearn.com/"

quote = rep.quote_plus("추천-강좌")

url = base + quote

res = req.urlopen(url).read()

savePath = "D:/python/Crawling/section2/downimg/"

try:

if not (os.path.isdir(savePath)):

os.makedirs(os.path.join(savePath))

except OSError:

if e.errno != errno.EExist:

print("폴더 만들기 실패!!")

raise

soup = be(res,"html.parser")

img_list = soup.select("ul.slides")[1]

print(img_list)

for i,e in enumerate(imglist,1):

with open(savePath+"text"+str(i)+".txt","wt") as f:

f.write(e.select_one("h4.block_title > a").string)

fullFileName = os.path.join(savePath,savePath+str(i)+'.png')

req.urlretrieve(e.select_one("div.block_media > a > img")['src'],fullFileName)

print("download OK!!")

=== 에러내용 ===

Traceback (most recent call last):

File "D:pythonCrawlingsection2download5-2.py", line 39, in

req.urlretrieve(e.select_one("div.block_media > a > img")['src'],fullFileName)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 188, in urlretrieve

with contextlib.closing(urlopen(url, data)) as fp:

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 163, in urlopen

return opener.open(url, data, timeout)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 466, in open

response = self._open(req, data)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 484, in _open

'_open', req)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 444, in _call_chain

result = func(*args)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 1297, in https_open

context=self._context, check_hostname=self._check_hostname)

File "C:ProgramDataAnaconda3envssection2liburllibrequest.py", line 1254, in do_open

h.request(req.get_method(), req.selector, req.data, headers)

File "C:ProgramDataAnaconda3envssection2libhttpclient.py", line 1107, in request

self._send_request(method, url, body, headers)

File "C:ProgramDataAnaconda3envssection2libhttpclient.py", line 1142, in _send_request

self.putrequest(method, url, **skips)

File "C:ProgramDataAnaconda3envssection2libhttpclient.py", line 984, in putrequest

self._output(request.encode('ascii'))

UnicodeEncodeError: 'ascii' codec can't encode characters in position 26-27: ordinal not in range(128)

부탁드리겠습니다^^;;

답변 1

답변을 작성해보세요.

0

안녕하세요 선명님 ^^
답변 달아드립니다.
지금 와서 테스트 해보니 올려주신 코드는 소스상에 문제는 전혀 없습니다.
"""
try:
if not (os.path.isdir(savePath)):
pass

os.makedirs(os.path.join(savePath))

except OSError as e:
if e.errno != errno.EEXIST:
print("폴더 만들기 실패!")
raise
soup = BeautifulSoup(res, "html.parser")
img_list = soup.select("ul.slides")[0] #0 , 1 , 2 모두 작동 가능
print(img_list)
"""
올려주신 코드는 문제가 없습니다.
UnicodeEncodeError: ‘ascii’ codec can’t encode characters
이 에러 문구(유니코드)는 파일을 쓸 때 나오는 에러 같은데 다른 부분은 정확하게 출력이 된다면,
특별히 소스상에는 문제가 없어보입니다.
39번 라인을 다시 확인해 보시고. 파일 쓰는 부분을 주석 처리 후 콘솔에서만 파싱이 되는지도
천천히 단위테스트 해보세요.
아래 유니코드 관련 에러 처리 링크를 남겨드립니다. 참고하세요.
http://ourcstory.tistory.com/39
정 해결이 안되면, 주말에 원격으로 한 번 봐드릴께요. 천천히 해결해 보아요.
감사합니다.