2020年4月12日日曜日

Emacs batch mode と HTML解析

前提

  • たくさんあるhtmlファイルの加工、編集をしたい。
  • 環境はWindows 10.
  • Emacsは入ってます。バージョン26.3.
  • MSYS2も入っていてBash使用可能。
  • しかしPython等のお手軽スクリプト言語の実行環境は無し。MicrosoftのPowershellやその他スクリプト言語には不慣れ。

ということでEmacsのDOM処理用関数を使うワンライナーを書くことにしました。


例題

カレントディレクトリにある拡張子htmlのファイルを開いてid="my-content"をもつ要素だけを抽出し、テキスト化して拡張子.txtのファイルに保存する、というもの。

for f in *.html; do
/c/Users/${user}/local/emacs-26.3-x86_64/bin/emacs --batch $f --eval='(princ (dom-texts (dom-by-id (libxml-parse-html-region (point-min) (point-max)) "my-content") "\n"))' > $f.txt;
done
  • "/c/Users/${user}/local/emacs-26.3-x86_64/bin/emacs": Windows上のemacsコマンドのパス
  • "--batch": Emacsバッチモード。バッチモードの定義は下記参考ページに書いてある。大雑把には、普段「バッファ」や「ウィンドウ」を使用するEmacsの入出力関数(message, princなど)を標準入力や標準出力、標準エラー出力に結び付けて、非インタラクティブに処理を実行する。
  • "--batch"直後の$fは処理対象のhtmlファイルで、非インタラクティブなEmacsはこのファイルを開いてバッファに読み込む。
  • "--eval"の引数としてelispコードを渡す。この例ではhtmlを開いたバッファ全体を"libxml-parse-html-region"関数に渡してDOM化し、次のそのDOMから"my-content"というidをもつ要素を"dom-by-id"関数で選び、選ばれた要素を"dom-texts"関数に渡してテキスト部分を抽出して"princ"で出力している。どの関数もEmacs標準のものだから外部のelispは利用していない。

2 件のコメント:

  1. はじめまして、突然のコメントをお送りしますご無礼をお許しください。
    PearlMountain Limitedのリョウヨウと申します。

    弊社はソフトウェアを開発している会社です。

    失礼いたしますが、当サイトのご管理人様に弊社の製品「FlexClip」のレビューあるいは商品情報を書いていただければ幸いです。

    Flexclipはシンプルかつ強力なビデオメーカーで、マーケティングビデオや家族のストーリーを数分で作成できます。
    詳細はこちらです:https://www.flexclip.com/jp/

    よければ、こちらはプラスバージョンを提供し、ご管理人様にご体験していただきたいです。

    お忙しいところ誠に恐縮ですが、
    ぜひご検討のほどよろしくお願いいたします。

    返信削除
  2. Merkur Review 2021 - XN
    Merkur is a high-end 메리트카지노 brand of luxury wet shaving, Merkur Safety Razor – Merkur 34C Review 인카지노 - Merkur 34C. Rating: 4.8 · ‎Review 메리트 카지노 고객센터 by David Wise

    返信削除