HTMLデータをjqライクに処理するツール探し

HTMLデータをjqライクに処理するツール探し
Page content

ちょうど合うものを

JSONデータの整形や特定部分の抽出に便利で重宝する、「jq」というコマンドラインツールがある。このjqと同じような使い方で、巷の雑多なHTMLデータに対して適用できる、特定部分を抽出してくれるツールを探す必要があったので、検討したツール3つと簡単な処理の例をメモしておく。

今回のツールに求めた要件は次の2つである。test_1.html のHTMLソースを下記の参考情報に示す。

  1. test_1.html<div class="hoge"></div> に囲まれた部分を、可能であればそのまま (HTMLタグを含めたまま) 抽出できること
  2. test_1.html にわざと混ぜた、規格外の「<いじわるタグ>」に対してエラーを吐かないこと

Tool-1. hxselect (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’

$ 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.

$ cat test_1.html | htmlq 'div[class="hoge"]'
<div class="hoge">
			<p class="txt">
				test1<br>
				test2<br>
				&lt;いじわるタグ&gt;<br>
				test3
			</p>
		</div>

この出力は今回の私が求めている形だ。いじわるタグを「&lt;いじわるタグ&gt;」に変換してくれる点は、実際のブラウザ表示の再現になっておりありがたい。

参考情報

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>