python에서 · 같은 특수문자를 콘솔에 출력

galien의 이미지

edict 같은 콘솔용 온라인 사전을 만들어보려고 하고 있습니다.
이런 문제만 생기지 않았다면 절대 공개 안하고 혼자 사용할만큼 부끄러운 날림 소스인데요.

일단 말씀드리면 한국 야후 사전에 http로 질문을하고 대답으로 받아온
http소스를 관심 있는 부분만 추려서 화면에 뿌리려고 하는데요.

'점'이라던지, 괄호등이 ascii가 아니더군요.

일단 문서는 euc-kr이라고 써 있어서 euc-kr로 디코드 해서 화면에 보여주는데

특수문자들 때문에 지저분하게 나옵니다.
도움 부탁드립니다.

#!/usr/bin/env python

from sgmllib import SGMLParser
import htmlentitydefs
import urllib
import codecs
import sys

class BaseHTMLProcessor(SGMLParser):
    def reset(self):
                SGMLParser.reset(self)
                self.pieces = []
                self.vt = False

    def start_p(self, att):
        if att[0][1] == u'p05' or att[0][1] == u'p03':
            self.vt = True

    def end_p(self):
        if self.vt:
            self.pieces.append("\n")
            self.vt = False

    def handle_data(self, text):
        if self.vt:
            self.pieces.append(text)

    def output(self):
        """Return processed HTML as a single string"""
        return "".join(self.pieces)

class ydicthon(BaseHTMLProcessor):

    def reset(self):
        BaseHTMLProcessor.reset(self)

    def go(self, key="dig"):
        keyurl="http://kr.dic.yahoo.com/search/eng/search.html?prop=eng&p="+key+"&x=0&y=0&type=eng"
        sock = urllib.urlopen(keyurl)
        htmlSource = sock.read()
        sock.close()
        hs = codecs.decode(htmlSource, "euc-kr")
        self.feed(hs)
        print self.output()

if __name__ == "__main__":
    a = ydicthon()
    key = sys.argv[1]
    print a.go(key)

이상이 저의 못난 파이썬 코드이고
결과는 다음과 같습니다.

python ydicthon.py python


 (무당에게 내리는) 혼령, 악령; 혼령이나 귀신이 들린 사람; (혼령이나 악령이 들린) 예언자, 점술사.



1. 〈그리스 신화〉 피톤(Apollo가 Delphi에서 퇴치한 거대한 뱀).
2. (p-) 비단뱀류, 거대한 구렁이.

None

음... 그러고 보니 맨 밑의 None도 뭔가의 버그 같네요. 그나마 파이썬 같은 경우는 덜 지저분하지만, 뜻이 많은 단어는 보기가 힘들어요
lifthrasiir의 이미지

이 정도면 될까요? 참고로 None이 나오는 이유는 ydicthon.go 메소드가 아무 것도 반환하지 않기 때문입니다. (return 문이 없으므로 None을 반환합니다) 저 경우에는 print를 하지 않고 그냥 a.go(key)라고만 하셔야 겠지요.

import re, htmlentitydefs

_xmlcoderef_regexp = re.compile(r'&(?:#(\d+)|#x([\da-f]+)|(\w+));?', re.I)
def _xmlcoderef_callback(m):
    if m.group(1): return unichr(int(m.group()))
    if m.group(2): return unichr(int(m.group(2), 16))
    try: return unichr(htmlentitydefs.name2codepoint[m.group(3)])
    except: return m.group()

def decodeXMLCodeRef(s):
    return _xmlcoderef_regexp.sub(_xmlcoderef_callback, s)

웹 페이지 긁어 오는 목적이라면 BeautifulSoup을 추천드립니다.

- 토끼군

익명 사용자의 이미지

None 은 쉽게 알았습니다. 감사합니다. :oops:

뷰티플 습은 지금 읽고있는데 편리해 보이는 군요.
(도대체 이런 것들은 어디서 다 정보를 접하시는지..)

그리고 주신 코드는 아이들 열어서 좀 공부해 봐야겠습니다.

감사합니다.

galien의 이미지

그러고 보니 저런 문자들이 어떤 캐릭터 셋에 정의 된 것인가요?

보시다 시피 파이선 코드에서는 저걸 (야후가 말한대로) ecu_kr로 디코딩했는데,
한글은 보이지만 저 문자들은 안보이네요.

콘솔 환경은 ko_KR.UTF-8인데요. 이것과 관계가 잇는 것인지요.

lifthrasiir의 이미지

김상욱 wrote:
그러고 보니 저런 문자들이 어떤 캐릭터 셋에 정의 된 것인가요?

보시다 시피 파이선 코드에서는 저걸 (야후가 말한대로) ecu_kr로 디코딩했는데,
한글은 보이지만 저 문자들은 안보이네요.

콘솔 환경은 ko_KR.UTF-8인데요. 이것과 관계가 잇는 것인지요.

아, 하나 제가 안 말씀드린 것이 있는데, 저 함수는 유니코드 문자열을 입력으로 받습니다. 즉 decode된 내용을 함수에 넣어야지 함수에 넣고 나온 결과를 가지고(에러가 날 가능성이 높습니다만) 디코딩하면 안 됩니다. 유니코드 문자열을 가지고 작업할 경우 print 할 때 자동으로 인코딩하기 때문에 별 문제는 없으리라 생각합니다.

- 토끼군

송효진의 이미지

ncr code or html entity

&#decimal; or &#xHEXA;

UCS-2 Little Endian

iconv('UCS-2', 'UTF-8', 0x00B7)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.