-
카테고리
-
세부 분야
데이터 분석
-
해결 여부
미해결
이번강좌 숙제 문의
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)
부탁드리겠습니다^^;;
답변을 작성해보세요.
0
좋은사람
지식공유자2018.03.20
안녕하세요 선명님 ^^
답변 달아드립니다.
지금 와서 테스트 해보니 올려주신 코드는 소스상에 문제는 전혀 없습니다.
"""
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
정 해결이 안되면, 주말에 원격으로 한 번 봐드릴께요. 천천히 해결해 보아요.
감사합니다.
답변 1