goodic.py source code


# -*- coding: euc-jp -*-
import urllib, sys, string, re

###############################################################
# 使用法を表示する
###############################################################
def usage():
    print "Usage: goodic.py dictionary-type word [search-mode]"
    print ""
    print "       dictionary-types are:"
    print "         ej: from English to Japanese"
    print "         je: from Japanese to English"
    print "         jn: from Japanese to Japanese"
    print ""
    print "       Search modes:"
    print "         0: prefix search(default)"
    print "         1: perfect matching"
    print "         2: search from explanation"
    print ""
    sys.exit()

###############################################################
# 引数を解析してURLを作成
###############################################################
def get_url(args):
    url = "http://dictionary.goo.ne.jp/search.php"

    if len(args) in [3, 4]:
        kind = args[1]
        word = unicode(args[2], "shift-jis").encode("euc-jp")

        if len(args) == 4:
            mode = args[3]
        else:
            mode = str(0)

        url += "?MT=" + word + "&kind=" + kind + "&mode=" + mode

        return url
    else:
        usage()

###############################################################
# URLを元にページを取得
###############################################################
def get_page(url):
    try:
        conn = urllib.urlopen(url)
    except IOError:
        sys.exit("Can't connect Goo.")
    else:
        page = conn.readlines()
        conn.close()
        return page

###############################################################
# ページ中の「意味」部分を抜き出す
###############################################################
def get_mean(page):
    mean = ""
    is_mean = 0
    rmpat = re.compile(r'<.*?>|&.*?;', re.DOTALL)

    for line in page:
        if string.strip(line) == "<!--meaning_body-->":
            is_mean = 1
        elif string.strip(line) == "<!--/meaning_body-->":
            is_mean = 0
            break

        if is_mean:
            mean += string.strip(line)

    if len(mean):
        mean = string.replace(mean, "<br>", "\n")
        return re.sub(rmpat, "", mean)
    else:
        sys.exit("Not found!!")

###############################################################
# メイン
###############################################################
if __name__ == "__main__":
    url = get_url(sys.argv)
    page = get_page(url)
    mean = get_mean(page)

    print unicode(mean, "euc-jp").encode("shift-jis")