파이썬 질문입니다.
#-*- coding: utf-8 -*-
import csv # csv 파일로 저장하기 위한 모듈
import urllib # http 연결용 모듈
import requests # http 연결용 모듈
from bs4 import BeautifulSoup # HTML 문서 파싱라이브러리
import urllib2
#listing_separate.csv를 열어서 keyword_matrix라는 리스트에 추가
keyword_matrix = []
f = open('listing_separate.csv')
csvReader = csv.reader(f)
for row in csvReader:
for col in row:
keyword_matrix.append(col)
#get_pages는 url에 페이지에서 특정 숫자를 찾아서 정수형으로 반환
def get_pages(url):
src = requests.get(url).text # url에 해당하는 웹페이지를 읽어서 소스코드를 문자열에 저장
num = src[src.find("=",src.find(">>")-10)+1:src.find(">>")-2]
# .find() 는 문자열 내에 특정한 문자, 문자열이 있는지를 찾습니다.
# .find("=", 10) 은 11번째 글자부터 "="가 있는지를 찾고, "="의 인덱스를 리턴합니다.
# 없으면 -1이 리턴됩니다.
# 위 코드는
# ">>" 가 있는 곳의 앞 9글자 위치부터 "="를 찾아서, "="의 바로 다음 글자부터,
# ">>" 가 있는 곳의 바로 앞 2글자전까지 잘라냅니다.
# 문자열을 정수형으로 변환해서 리턴합니다.
return int(num)
for j in keyword_matrix:
pages = get_pages("http://newnovel.aks.ac.kr/Search?keyword="+j+"&page=1")
print pages
이렇게 하면 get_pages에서 정수형으로 반환된 숫자가 나올 줄 알았는데.
File "test2.py", line 48, in
pages = get_pages("http://newnovel.aks.ac.kr/Search?keyword="+j+"&page=1")
File "test2.py", line 33, in get_pages
return int(num)
UnicodeEncodeError: 'decimal' codec can't encode characters in position 220-221: invalid decimal Unicode string
라는 오류가 뜹니다.
어떻게 해결해야 하나요?
get_pages함수에서 return int(num)이부분에서 int(num)을 그냥 num으로 바꾸면 그 페이지 전체가 출력됩니다. j는 잘 들어가고요.
이거 같은데요.
파이썬 형변환
http://thrillfighter.tistory.com/275
str(j);
파이썬 진법변환
http://thrillfighter.tistory.com/295
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
...
문제를 보니 num에 제대로 된 숫자가 안 들어오는 것 같은데, 일단 num을 출력해서 의도한 값이 제대로 들어오는지부터 확인해 보세요. 형변환이나 진법변환 등은 다음 이야기입니다.
답변 감사드립니다.
.read()때문인지 그 페이지 소스 전체가 출력되서 보긴 힘들었지만
print num을 하면 숫자는 나옵니다.
return num을 하면 오류가 그 오류는 안뜨고 return int(num)을 하면 오류가 발생하는데 그럼 형변환이나 진법 변환을 봐야 하는건가요?
그것은...
---------------------------------------------------------------
숫자를 문자와 더할때는 이렇게 사용하고요.
여기서 테스트
https://www.python.org/
---------------------------------------------------------------
Unicode Encode 가 오류 날때는 이렇게 사용하는거 같습니다.
UnicodeEncodeError
https://search.naver.com/search.naver?ie=utf8&sm=stp_hty&where=se&query=UnicodeEncodeError
UnicodeEncodeError: 'decimal' codec can't encode characters in position 220-221: invalid decimal Unicode string
https://search.naver.com/search.naver?ie=utf8&sm=stp_hty&where=se&query=UnicodeEncodeError%3A+%27decimal%27+codec+can%27t+encode+characters+in+position+220-221%3A+invalid+decimal+Unicode+string
여기 적어두셨네요.
http://kldp.org/node/154322
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
print num을 하면 숫자는 나옵니다. 라고
라고 쓰셨는데, 저는 여전히 num에 들어있는 값 자체가 원하는 게 아닐 것 같은데요.
이 코드대로라면 num의 길이는 기껏해야 7글자 이하여야 할 겁니다.
그런데 에러메시지에는 "position 220-221" 위치에 변환할 수 없는 문자가 있는 것으로 나오는군요.
num을 출력할 때 좌우에 표식을 붙여보든가 ('['+num+']' 같이) len(num) 등의 값을 같이 찍어보시죠. 정말 눈에 보이는 그 숫자말고 다른 게 들어있지 않은지.
그리고 코드를 올리실 때는 코드 전체를 code 태그로 둘러싸서 올려주시면 들여쓰기 등이 고스란히 유지되어서 좋습니다.
좋은 하루 되세요!
..
감사합니다. 그런데 소스를 돌리면 웹페이지 전체 html소스를 가져오는데 그건 왜 그런건가요?
전 print를 안했는데 웹페이지 전체가 나오네요.
print 구문이 전혀 없는데 출력이 되었다면,
print 구문이 전혀 없는데 출력이 되었다면, 그것은 사용하신 모듈에서 어떤 이유로(디버그 목적이거나?) 강제로 출력을 시켰나보죠.
하지만 이 경우 더 그럴싸한 추측은, 질문하신 분께서 ("print를 안 했다"라는 말과 다르게) print num 구문을 넣었고, 출력된 웹페이지 전체가 바로 num에 들어가 있는 값일 거라는 겁니다.
(그래서 num을 출력할 때 좌우에 표식을 붙이라고 한 겁니다. 그럼 눈에 확실히 보이니까)
그리고 잘 보시면 웹페이지 전체가 아니라 끝에 살짝 잘려서 ".../html" 까지만 나왔을 겁니다. 닫는 부등호와 줄바꿈문자가 사라진채로.
제가 좀 답답해서 ^^; (질문만 잘 하시면 문답 한 턴에 답이 나올 것 같은데 계속 이어지길래) 직접 사이트 들어가봤는데요,
검색어에 적당히 "시장"을 넣고 나온 URL
http://newnovel.aks.ac.kr/Search?keyword=%EC%8B%9C%EC%9E%A5&page=1
이 페이지 소스를 봤는데 ">>" 문자열은 없네요.
(브라우저 화면에 보이는 ">>"를 찾으려면 소스에서는 "
>>
"를 찾으셨어야...)">>"가 없으니 find(">>")의 결과는 -1이고,
src.find("=", -1 -10) 는 src 문자열의 마지막 11글자에서 =를 찾으려는데 이게 없으니 그 결과도 -1이고,
따라서 num은 결과적으로
src[ -1 + 1 : -1 - 2 ] => src[ 0 : -3 ]
이 되어서, src 의 "첫 번째 글자"부터 "끝에서 네 번째 글자"까지, 매우 긴 문자열이 num에 들어갔고,
이걸 int() 함수에 넣으니 숫자가 아닌 걸 숫자로 변환할 수 없어서 처음 질문한 그 에러 메시지가 나왔습니다.
어떤 변수의 값이 다른 변수의 값에 의존하는 과정을 거쳐 생겨난다면, "정말로 그 값이 내 예상대로 들어오는가"를 그때그때 확인하며 코드를 짜시는 게 좋습니다. 저였다면 src를 가져오는 구문 다음 줄에는 src를 출력시키고, num을 구한 다음 출력시켜보고, num이 원하는 값이 아닌 걸 발견하면 src.find의 결과를 출력시켜봤을 겁니다.
귀찮고 시간이 더 걸리겠지만, 당장 이 질문만 해도 src.find(">>")가 예상한 결과와 다르게 나오는 시점에서 해결할 수 있었던 거죠. 어제 저녁에 질문글 올리고 지금까지 기다릴 필요가 없이요. :-)
좋은 하루 되세요!
답변 정말 감사드립니다ㅎㅎ
print num문제는 일단 주석처리는 기본이고 아예 구문 삭제도 해봤구요.
>>문제는 이 원래 소스에선 >로 썻는데 이 싸이트에 올리면서 자동으로 >>으로 변환되었네요 ㅎㅎ
j를 안집어넣고 '서울'을 검색하면 72라는 정확한 값이 나옵니다.
답변 정말 감사드립니다. 지금 print src부터 차근차근 해보겠습니다.
해결된 것 같습니다.
답변자님의 답변에서 힌트를 얻어서 혹시 검색어가 이상하면 >도 없지 않을까 해서
keyword_matrix에 집어넣을 listing_separate.csv파일을 임의로 서울,교육,부산,kldp,대구 이런식으로 하니 서울 교육 부산까지는 정수형으로 잘 반환되지만 kldp부분에서 오류가 나는것을 확인하였고
실제로 웹 페이지에 들어가보니 kldp를 검색하면 아예 >부분이 없더군요. 그래서 답변자님 말씀대로 매우 긴 문자열이 나온 것 같습니다.
답변자님의 좋은 답변때문에 일단은 저 오류는 해결했습니다. page에 정확한 값들이 들어갑니다 감사합니다.
댓글 달기