コマンドラインでHTMLパースする
英語の勉強してて、副詞が弱いから語彙を増やそうと思い、
まずは自分がどれぐらい語彙があるのか確かめるために、副詞の一覧を作ってみることにした。
検索したら丁度いい感じのサイトが見つかった。
だけどこのサイトからコピペしようとすると途中で検索テキストボックスにフォーカスが移ってうまく選択できない。
しょうがないので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ファイルを出力する手順
- File -> Project Structure
- Artifacts -> Add(+)
- Jar -> from module with dependecies
- Main Classに作成したクラス名を指定 -> OK
- メニューのBuild -> Build Artifacts... -> jar
- Projectディレクトリの「out/artifacts/classname_jar」の下にjarファイルが生成される
実行方法
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'
取得結果
できた
あとはこれをファイルにリダイレクトするなりすれば良い。
あとがき
本来ならこういうのってPythonとかRubyとかのLLでワンライナー書くものだろうけど
そこらへんの知識が疎いのでScalaで何とかした。
もうちょっとスマートな方法あるよってのがあればぜひ教えてもらいたい
検索したらちょうど良さそうなのがあった…