• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

숙제 관련 질문입니다.

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]

이렇게 뜹니다.

답변 1

답변을 작성해보세요.

0

안녕하세요.
콘솔내용을 보시면 인코딩 에러입니다.
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