1. akif999

    Posted

    akif999
Changes in title
+goqueryでweblio百科事典のコマンドラインビューアを作ってみた
Changes in tags
Changes in body
Source | HTML | Preview

BackGround

よくお世話になっているweblio英和和英辞典
調べるときはおもむろにブラウザのタブを追加して...となることが多い。
macには辞書.appなるものも入っていて三本指タップで検索、とかできるけど、
CLIが好きな筆者としては辞書もコマンドラインから叩きたい。
というわけでGo × goqueryでスクレイピングなノリで作ってみた。

※ 筆者は限りなくハードウェア寄りのソフトウェアエンジニアで、web系の知識がないため、そのあたりの解説がプアなのはご了承下さい

Demo

$ ./webligo apple
単語             : apple
主な意味         : リンゴ
音節             : ap・ple
発音記号・読み方 : ˈæpl
$ ./webligo pen
単語             : pen
主な意味         : (昔の、ペン先  とペン軸  を含めて)ペン、鵞()ペン、文筆(の業)
音節             : pen
発音記号・読み方 : pén
$ ./webligo hoge
単語             : hoge
主な意味         : とくに意味もないときに使う変数名
音節             : 
発音記号・読み方 : hóʊdʒ
$ ./webligo fuga
単語             : fuga
主な意味         : フーガ
音節             : 
発音記号・読み方 : 
$ ./webligo 鯖
日単語           : 鯖
英単語           : mackerel
$ ./webligo 鯵
日単語           : 鯵
英単語           : horse mackerel

必要最低限な情報だけ出力するようにした。
こういう単純化がしやすいからコマンドラインはいい。

SourceCode

package main

import (
    "fmt"
    "log"
    "unicode/utf8"

    "github.com/PuerkitoBio/goquery"
    "gopkg.in/alecthomas/kingpin.v2"
)

const (
    EnToJp = iota
    JpToEn
)

var (
    refWord = kingpin.Arg("refWord", "refWord string").Required().String()
)

func main() {
    kingpin.Parse()

    // if refWord includes multibyte charactor, set mode to JpToEn
    mode := EnToJp
    if utf8.RuneCountInString(*refWord) != len(*refWord) {
        mode = JpToEn
    }

    doc, err := goquery.NewDocument("http://ejje.weblio.jp/content/" + *refWord)
    if err != nil {
        log.Fatal(err)
    }
    if mode == EnToJp {
        fmt.Printf("単語             : %s\n", *refWord)
        fmt.Printf("主な意味         : %s\n", doc.Find(".content-explanation").Text())
        fmt.Printf("音節             : %s\n", doc.Find(".syllableEjje").Text())
        fmt.Printf("発音記号・読み方 : %s\n", doc.Find(".phoneticEjjeDesc").Text())
    } else {
        fmt.Printf("日単語           : %s\n", *refWord)
        fmt.Printf("英単語           : %s\n", doc.Find(".content-explanation").Text())
    }
}

基本的にはFind()でセレクタを利用して欲しい情報を取りに行くだけなので、とても簡単に描けた。
プログラミング的には不満でも、packageの使いやすさには満足。

Roundup

  • weblio自体がinputをとても柔軟に捉えてくれるので、リッチな使いごごち
  • アクセス速度に実行時間は依存するが、アクセス後の処理は一瞬で、実用的な仕上がり
  • goqueryはwebの知識が無くとも、簡素なスクレイピングプログラムくらいはすぐに書ける