HTMLデータをjqライクに処理するツール探し
Page content
ちょうど合うものを
JSONデータの整形や特定部分の抽出に便利で重宝する、「jq」というコマンドラインツールがある。このjqと同じような使い方で、巷の雑多なHTMLデータに対して適用できる、特定部分を抽出してくれるツールを探す必要があったので、検討したツール3つと簡単な処理の例をメモしておく。
今回のツールに求めた要件は次の2つである。test_1.html
のHTMLソースを下記の参考情報に示す。
test_1.html
の<div class="hoge">
と</div>
に囲まれた部分を、可能であればそのまま (HTMLタグを含めたまま) 抽出できることtest_1.html
にわざと混ぜた、規格外の「<いじわるタグ>
」に対してエラーを吐かないこと
Tool-1. hxselect (html-xml-utils)
- 公式サイト: https://www.w3.org/Tools/HTML-XML-utils/README
- インストール方法:
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 <いじわるタグ>
Tool-2. heq: Yet Another ‘jq for HTML’
- 公式サイト: https://github.com/atodekangae/heq, jq の HTML 版を作った
- インストール方法:
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タグが消されて、かついじわるタグも同じように消されての出力となった。なお、かつメタ文字への変換が働いているが、そのまま無変換で出力する方法が分からなかった。
Tool-3. htmlq: Like jq, but for HTML.
- 公式サイト: https://github.com/mgdm/htmlq
- インストール方法:
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>
この出力は今回の私が求めている形だ。いじわるタグを「<いじわるタグ>
」に変換してくれる点は、実際のブラウザ表示の再現になっておりありがたい。
参考情報
test_1.htmlの内容
<!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_2.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>