hq:118⭐の軽量HTMLコマンドラインプロセッサ
hq:118⭐の軽量HTMLコマンドラインプロセッサ
コマンドラインでJSONを処理するならjq、CSVならcsvkit、ではHTMLは?今日紹介する軽量なニッチツール hq は、CSSセレクタだけでWebページからデータを抽出できます。
プロジェクト概要
| 属性 | 内容 |
|---|---|
| GitHub | coderobe/hq |
| Stars | 118 |
| 言語 | C++ |
| ライセンス | GPL-3.0 |
| 最終更新 | 2025年3月 |
解決する問題
スクレイピングやWebページからデータを抽出する際、既存のツールは重すぎる(Python + BeautifulSoup)か、機能が単一すぎる(grep、awkでHTMLを処理するのは面倒)ことがあります。
hqの位置づけはシンプルです:CSSセレクタを使ってコマンドラインでHTMLを処理する。まるでjqでJSONを処理するように直感的です。
主な機能
hqは3つの処理モードを提供します:
1. data モード - 生のHTMLを抽出
curl -s https://example.com | hq "div.article" data
マッチした要素の完全なHTMLを返します。
2. text モード - プレーンテキストを抽出
curl -s https://example.com | hq "h1" text
要素の内部テキストを抽出します。フォーマットオプションをサポート:
plain- プレーンテキスト(デフォルト)ansi- ANSIカラー付きmd- Markdown形式
3. attr モード - 属性を抽出
curl -s https://example.com | hq "a" attr href
指定した属性の値を抽出します。例えばすべてのリンクURLを取得します。
使用例
Webページのすべてのリンクを抽出
curl -s https://news.ycombinator.com | hq "a.storylink" text
記事本文を抽出
curl -s https://example.com/blog/post | hq "article p" text plain
画像リンクを一括取得
curl -s https://example.com/gallery | hq "img" attr src
インストール方法
ソースからコンパイル:
git clone https://github.com/coderobe/hq.git
cd hq
meson build && ninja -C build
# コンパイル後は build/hq に配置
依存関係:
- meson(ビルドシステム)
- modest(HTMLパースライブラリ)
技術実装
hqはModestライブラリを基盤に構築されています。これは高性能なHTMLパーサーです。C++で実装されているため処理速度が保証され、パイプライン操作やバッチ処理に適しています。
使用シナリオ
- クイックスクレイピング - Pythonを書かずに一行コマンドでデータ抽出
- ログ分析 - HTML形式のログやレポートを処理
- 自動テスト - Webページの出力内容を検証
- データクレンジング - HTMLから構造化データをエクスポート
他のツールとの比較
| ツール | Stars | 特徴 |
|---|---|---|
| htmlq | 7.5k | Rust実装、機能が豊富 |
| pup | 8.2k | Go実装、jq風の構文 |
| hq | 118 | C++実装、ミニマルデザイン |
hqの利点はシンプルで直感的な点です。複雑な構文はなく、3つのモードで一般的なニーズをカバー。ソースコードは数百行だけで、理解と修正が容易です。
使用上の注意
- CSSセレクタサポート - Modestをベースに、標準CSS3セレクタをサポート
- 入力ソース - ファイル(
-f)または標準入力をサポート、パイプライン対応 - 出力区切り - デフォルトは改行区切り、
-dでカスタマイズ可能、-0でnull文字(xargs -0と併用)
まとめ
hqは小さく洗練されたツールで、「とにかく素早くデータを抽出したい」というシーンに最適です。膨大な依存関係をインストールする必要も、スクリプトを書く必要もありません。CSSセレクタ一つで済みます。
日常でHTMLを処理する必要がある開発者にとって、ツールボックスに入れておく価値があります。
プロジェクト情報
| 属性 | 内容 |
|---|---|
| リポジトリ | https://github.com/coderobe/hq |
| ライセンス | GPL-3.0 |
| 言語 | C++ |
| メンテナ | @coderobe |
記事は gumi.ink で公開