-
카테고리
-
세부 분야
데이터 분석
-
해결 여부
미해결
숙제 관련 질문입니다.
19.02.15 17:54 작성 조회수 122
0
숙제를 할때 recommand = soup.select("ul.slides")[ ?? ] ??이 부분을 0 ,1,2 로 나누어서 하면 될것같은데 위 질문드리신 님처럼 저도 똑같은 에러가 납니다. 밑의 댓글을 확인해 보았을 때 이미지 확장자가 gif인것도 있고 다른 것도 있기 때문에 생길 수 도 있다는데 도저히 제 힘으론 해결이 안되는 것 같습니다. 혹 어떠한 것 때문에 알 수 있는지요.
제코드는
from bs4 import BeautifulSoup
import urllib.request as req
import urllib.parse as rep
import os
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
savePath ="C:\imagedown2\"
base = "https://www.inflearn.com/"
quote = rep.quote_plus("추천-강좌")
url = base + quote
res = req.urlopen(url).read()
soup = BeautifulSoup(res,"html.parser")
recommand = soup.select("ul.slides")[2]
print(recommand)
try:
if not(os.path.isdir(savePath)):
os.makedirs(os.path.join(savePath))
except OSError as e:
if e.errno != errno.EEXIST:
print("Failed to create directory!!!!!")
raise
test =[]
en_test=[]
for i,e in enumerate(recommand,1):
open앞 파일 경로 + "파일의 이름", "어떠한 형식으로 작성할것인지"
with open(savePath+"title_"+str(i)+".txt", "wt") as f: f.write(e.select_one("h4.block_title > a ").string)
fullfilename = os.path.join(savePath, savePath+'img_'+str(i)+'.png')
#urlretrieve 기능은 앞에 파일원본, 파일이 들어갈 경로
test=e.select_one("div.block_media > a > img")['src']
#en_test = test.encode('utf-8')
#req.urlretrieve(en_test,fullfilename)
req.urlretrieve(e.select_one("div.block_media > a > img")['src'],fullfilename)
print("강좌 정보 텍스트 출력 및 이미지 다운 완료!")
이렇게 작성이 되었구요. 에러 코드는
Traceback (most recent call last):
File "C:section2inflearn_homework_img.py", line 38, in
req.urlretrieve(e.select_one("div.block_media > a > img")['src'],fullfilename)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 188, in urlretrieve
with contextlib.closing(urlopen(url, data)) as fp:
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 163, in urlopen
return opener.open(url, data, timeout)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 466, in open
response = self._open(req, data)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 484, in _open
'_open', req)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 444, in _call_chain
result = func(*args)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 1297, in https_open
context=self._context, check_hostname=self._check_hostname)
File "C:UsersuserAnaconda3envssection2liburllibrequest.py", line 1254, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "C:UsersuserAnaconda3envssection2libhttpclient.py", line 1107, in request
self._send_request(method, url, body, headers)
File "C:UsersuserAnaconda3envssection2libhttpclient.py", line 1142, in _send_request
self.putrequest(method, url, **skips)
File "C:UsersuserAnaconda3envssection2libhttpclient.py", line 984, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 24-29: ordinal not in range(128)
[Finished in 10.976s]
이렇게 뜹니다.
답변을 작성해보세요.
0
좋은사람
지식공유자2019.02.15
안녕하세요.
콘솔내용을 보시면 인코딩 에러입니다.
f.read().decode('utf-8') 이런 형식으로 utf-8로 인코딩 하셔야 될 것같습니다.
숙제 같은 경우는 소스코드상에는 에러는 없습니다. 다만, 인프런의 강좌가 계속 바뀌고 이미지 타입도
변하기 때문에 우선은 텍스트 부분만 긁어오는 테스트로 시도하시고 나머지는 섹션을 넘어가서 좀 더 숙련도가
높아진 후 다른 사이트를 대상으로 시도하시면 될 것같습니다.
아래 구글 url을 참고하시기 바랍니다.
https://www.google.com/search?q=UnicodeEncodeError%3A+%E2%80%98ascii%E2%80%99+codec+can%E2%80%99t+encode+characters&oq=UnicodeEncodeError%3A+%E2%80%98ascii%E2%80%99+codec+can%E2%80%99t+encode+characters&aqs=chrome..69i57j69i58.342j0j8&sourceid=chrome&ie=UTF-8
답변 1