파이썬 질문입니다.

lhm7877의 이미지

#-*- 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는 잘 들어가고요.

shint의 이미지

파이썬 형변환
http://thrillfighter.tistory.com/275

str(j);

파이썬 진법변환
http://thrillfighter.tistory.com/295

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

문제를 보니 num에 제대로 된 숫자가 안 들어오는 것 같은데, 일단 num을 출력해서 의도한 값이 제대로 들어오는지부터 확인해 보세요. 형변환이나 진법변환 등은 다음 이야기입니다.

lhm7877의 이미지

.read()때문인지 그 페이지 소스 전체가 출력되서 보긴 힘들었지만
print num을 하면 숫자는 나옵니다.
return num을 하면 오류가 그 오류는 안뜨고 return int(num)을 하면 오류가 발생하는데 그럼 형변환이나 진법 변환을 봐야 하는건가요?

shint의 이미지

---------------------------------------------------------------
숫자를 문자와 더할때는 이렇게 사용하고요.

t = 1                     #변수 t = 숫자 1 입력
s = 't' + str(t)        #변수 s = 문자 + 문자로 변환함수(숫자) 입력
print (s)                #변수s 출력
 
출력 결과 - 문자 t1
t1

여기서 테스트
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

raymundo의 이미지

print num을 하면 숫자는 나옵니다.

라고 쓰셨는데, 저는 여전히 num에 들어있는 값 자체가 원하는 게 아닐 것 같은데요.

num = src[src.find("=",src.find(">>")-10)+1:src.find(">>")-2]

이 코드대로라면 num의 길이는 기껏해야 7글자 이하여야 할 겁니다.
그런데 에러메시지에는 "position 220-221" 위치에 변환할 수 없는 문자가 있는 것으로 나오는군요.

num을 출력할 때 좌우에 표식을 붙여보든가 ('['+num+']' 같이) len(num) 등의 값을 같이 찍어보시죠. 정말 눈에 보이는 그 숫자말고 다른 게 들어있지 않은지.

그리고 코드를 올리실 때는 코드 전체를 code 태그로 둘러싸서 올려주시면 들여쓰기 등이 고스란히 유지되어서 좋습니다.

 (code lang="python")    -- 실제 쓸 때는 괄호 대신 부등호로
 코드
 (/code)

좋은 하루 되세요!

lhm7877의 이미지

감사합니다. 그런데 소스를 돌리면 웹페이지 전체 html소스를 가져오는데 그건 왜 그런건가요?
전 print를 안했는데 웹페이지 전체가 나오네요.

raymundo의 이미지

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(">>")가 예상한 결과와 다르게 나오는 시점에서 해결할 수 있었던 거죠. 어제 저녁에 질문글 올리고 지금까지 기다릴 필요가 없이요. :-)

좋은 하루 되세요!

lhm7877의 이미지

print num문제는 일단 주석처리는 기본이고 아예 구문 삭제도 해봤구요.
>>문제는 이 원래 소스에선 &gt로 썻는데 이 싸이트에 올리면서 자동으로 >>으로 변환되었네요 ㅎㅎ
j를 안집어넣고 '서울'을 검색하면 72라는 정확한 값이 나옵니다.

num = src[src.find("=",src.find(">>")-10)+1:src.find(">>")-2]

답변 정말 감사드립니다. 지금 print src부터 차근차근 해보겠습니다.

lhm7877의 이미지

답변자님의 답변에서 힌트를 얻어서 혹시 검색어가 이상하면 &gt도 없지 않을까 해서
keyword_matrix에 집어넣을 listing_separate.csv파일을 임의로 서울,교육,부산,kldp,대구 이런식으로 하니 서울 교육 부산까지는 정수형으로 잘 반환되지만 kldp부분에서 오류가 나는것을 확인하였고
실제로 웹 페이지에 들어가보니 kldp를 검색하면 아예 &gt부분이 없더군요. 그래서 답변자님 말씀대로 매우 긴 문자열이 나온 것 같습니다.
답변자님의 좋은 답변때문에 일단은 저 오류는 해결했습니다. page에 정확한 값들이 들어갑니다 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.