JSONデータの整形や特定部分の抽出に便利で重宝する、「jq」というコマンドラインツールがある。このjqと同じような使い方で、巷の雑多なHTMLデータに対して適用できる、特定部分を抽出してくれるツールを探す必要があったので、検討したツール3つと簡単な処理の例をメモしておく。
今回のツールに求めた要件は次の2つである。test_1.html
のHTMLソースを下記の参考情報に示す。
test_1.html
の <div class="hoge">
と </div>
に囲まれた部分を、可能であればそのまま (HTMLタグを含めたまま) 抽出できることtest_1.html
にわざと混ぜた、規格外の「<いじわるタグ>
」に対してエラーを吐かないことsudo apt install html-xml-utils
, brew install html-xml-utils
など$ cat test_1.html | hxselect 'div[class="hoge"]'
hxselect: End tag </head> doesn't match start tag <meta>
test_1.html
の <meta charset="utf-8">
が /
で閉じていないことで文句を言うようだ。そこで /
を追加した test_2.html
を用意したのだが、今度はいじわるタグで止まった。
$ cat test_2.html | hxselect 'div[class="hoge"]'
hxselect: End tag </p> doesn't match start tag <いじわるタグ>
pip install heq
$ cat test_1.html | heq '`//div[@class="hoge"]`.text'
"\n\t\t\t\n\t\t\t\ttest1\n\t\t\t\ttest2\n\t\t\t\t\n\t\t\t\ttest3\n\t\t\t\n\t\t"
抽出部分からはHTMLタグが消されて、かついじわるタグも同じように消されての出力となった。なお、かつメタ文字への変換が働いているが、そのまま無変換で出力する方法が分からなかった。
brew install htmlq
, sudo snap install htmlq
など$ cat test_1.html | htmlq 'div[class="hoge"]'
<div class="hoge">
<p class="txt">
test1<br>
test2<br>
<いじわるタグ><br>
test3
</p>
</div>
この出力は今回の私が求めている形だ。いじわるタグを「<いじわるタグ>
」に変換してくれる点は、実際のブラウザ表示の再現になっておりありがたい。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>これはテストファイルです</title>
</head>
<body>
<h1>H1です</h1>
<h2>H2です</h2>
<div class="hoge">
<p class="txt">
test1<br />
test2<br />
<いじわるタグ><br />
test3
</p>
</div>
</body>
</html>
test_1.html
との差は、「<meta charset="utf-8">
」を「<meta charset="utf-8" />
」に置換しているのみ。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>これはテストファイルです</title>
</head>
<body>
<h1>H1です</h1>
<h2>H2です</h2>
<div class="hoge">
<p class="txt">
test1<br />
test2<br />
<いじわるタグ><br />
test3
</p>
</div>
</body>
</html>