Bash:
HTMLの解析

方法:

HTMLをパースするためにBashが最初に思い浮かぶものではありませんが、grepawksedや外部ユーティリティlynxのようなツールを利用して行うことができます。ロバストさを求めるならば、libxml2パッケージからxmllintを使用します。

# 必要であれば xmllint をインストール
sudo apt-get install libxml2-utils

# サンプル HTML
cat > sample.html <<EOF
<html>
<head>
  <title>Sample Page</title>
</head>
<body>
  <h1>Hello, Bash!</h1>
  <p id="myPara">Bash can read me.</p>
</body>
</html>
EOF

# タイトルをパースする
title=$(xmllint --html --xpath '//title/text()' sample.html 2>/dev/null)
echo "タイトルは: $title"

# IDによる段落の抽出
para=$(xmllint --html --xpath '//*[@id="myPara"]/text()' sample.html 2>/dev/null)
echo "段落の内容は: $para"

出力:

タイトルは: Sample Page
段落の内容は: Bash can read me.

深堀り

昔、プログラマーはgrepのような正規表現ベースのツールを使ってHTMLをスキャンしていましたが、それは不格好でした。HTMLは規則正しくなく、文脈に依存しています。伝統的なツールはこれを見落とし、エラーが発生しやすいです。

代替手段は? 多数あります。Beautiful Soupを使ったPython、DOMDocumentを使ったPHP、DOMパーサーを使ったJavaScript—HTMLの構造を理解するように設計されたライブラリを持つ言語です。

bashスクリプトでのxmllintの使用は、単純な作業には確かです。XMLを理解し、その延長でXHTMLを理解します。ただし、通常のHTMLは予測不可能な場合があります。XMLの厳格なルールには常に従わないためです。xmllintはHTMLをXMLモデルに強制することで、形式が整っているHTMLにはうまく機能しますが、乱雑なものについては躓く可能性があります。

参照