1. akif999

    Posted

    akif999
Changes in title
+goqueryでweblio百科事典のコマンドラインビューアを作ってみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,95 @@
+# BackGround
+よくお世話になっている[weblio英和和英辞典](http://ejje.weblio.jp)。
+調べるときはおもむろにブラウザのタブを追加して...となることが多い。
+macには辞書.appなるものも入っていて三本指タップで検索、とかできるけど、
+CLIが好きな筆者としては辞書もコマンドラインから叩きたい。
+というわけで`Go × goqueryでスクレイピング`なノリで作ってみた。
+
+※ 筆者は限りなくハードウェア寄りのソフトウェアエンジニアで、web系の知識がないため、そのあたりの解説がプアなのはご了承下さい
+
+# Demo
+```bash
+$ ./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
+```go
+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の知識が無くとも、簡素なスクレイピングプログラムくらいはすぐに書ける