コマンドラインでHTMLパースする

英語の勉強してて、副詞が弱いから語彙を増やそうと思い、
まずは自分がどれぐらい語彙があるのか確かめるために、副詞の一覧を作ってみることにした。

中学以上の水準の英語の副詞一覧 - Weblio英和和英

検索したら丁度いい感じのサイトが見つかった。
だけどこのサイトからコピペしようとすると途中で検索テキストボックスにフォーカスが移ってうまく選択できない。

しょうがないのでHTMLをパースしようと考えた。
また、こういうこと結構あるので汎用的に使えるようなのにしようと思う。

作るもの

  • パイプで受け取ったHTMLをパースする
  • セレクタ記法で要素を指定する

コード

Scalaクローラーを作っていたので、そこで使っていたJSONをParserとして使う。
stdinから取得したHTMLをパラメータから取得したセレクタで解析してstdoutに出力する単純なコード
scalaだととても短く書けるから良い。

import org.jsoup.Jsoup
import scala.collection.JavaConversions._
/**
 * Created by bpk_t on 2014/12/23.
 */
object getel {
  def main(args: Array[String]) {
    Jsoup.parse(scala.io.Source.stdin.getLines.mkString)
            .select(args(0))
            .foreach(println(_))
  }
}

Jarファイルにする

単発で実行できるようにするためJarファイルに全部まとめる
IntellijのJarファイルを出力する手順

  1. File -> Project Structure
  2. Artifacts -> Add(+)
  3. Jar -> from module with dependecies
  4. Main Classに作成したクラス名を指定 -> OK
  5. メニューのBuild -> Build Artifacts... -> jar
  6. Projectディレクトリの「out/artifacts/classname_jar」の下にjarファイルが生成される

実行方法

curlに繋げてセレクタを指定して実行する

curl -s http://ejje.weblio.jp/parts-of-speech/kenej/%E4%B8%AD%E5%AD%A6_25 | java -jar getelem.jar 'div.phraseWords>ul>li>a'

取得結果

できた
あとはこれをファイルにリダイレクトするなりすれば良い。

f:id:hkou:20141224142303p:plain

あとがき

本来ならこういうのってPythonとかRubyとかのLLでワンライナー書くものだろうけど
そこらへんの知識が疎いのでScalaで何とかした。
もうちょっとスマートな方法あるよってのがあればぜひ教えてもらいたい

検索したらちょうど良さそうなのがあった…

Big Sky :: html をコマンドラインからパースするなら pup が便利