DfromHtml [ -p Xpath ] [ options ] [ input-file.. ]
DfromHtmlは, HTMLのinput-filesの一部を抽出し, Dレコードに変換する。 典型的には,HTMLファイル中のURL参照を抽出したり, ヘッダからメタデータを抽出したり, あるいはHTMLのテーブルをDファイルに変換したりするのに使われる。
変換する要素を選択するためには, "-p xpath"オプションを使用する。 XpathはXMLのノードを指定するための言語である。 HTMLは,XMLと完全な互換性はないが,同様のツリー構造で表現することができ, その要素はxpathで選択することができる。
省略時の-pオプションの値は"//a/@href/.."で, これは,href属性をもつすべてのアンカー要素(<a>)を選択する。 Xpath式の"//"は,任意個数のノードレベルを表し, "@"は属性ノードを表し, ".."は親ノードを表す。
HTMLのテーブルをDレコードに変換するには, 多くの場合,"//tr"で可能である。 これは,すべてのテーブルの「行」を選択するもので, その中の各項がDフィールドとなる。 文書中に複数のテーブルがある場合, "//table[n]//tr"(nは一連番号) が使える。 xpathの見つけ方節参照。
HTMLヘッダ中のtitleを選択するには, "/html/head/title"とすればよい。 同様に,"/html/head/meta"は,ヘッダ中のメタデータを選択する。
省略時xpathの場合,出力は次のようになる。
node:/html/body/p[1]/a
@href:../jpn/Dintro.html
text:Japanese
node:/html/body/table[1]/tbody/tr[2]/td[1]/a
@href:DfromLine.html
b:DfromLine
node:/html/body/address/a
@href:mailto:miyazawa@nii.ac.jp
img:
@src:logo.gif
出力レコードは,選択された各要素から作られる。 先頭の"node"フィールドは,その要素を識別するxpath式となっている。 それに続くフィールドでフィールド名が COMMERCIAL AT(@)文字で始まるものは, 選択された要素の属性から作られたものである。 フィールド名は@属性名であり,フィールド値はその属性の値である。 選択された要素のもとのテキストは,フィールド名 "text"となる。
選択された要素の直下にある要素も,独立のDフィールドとなる。 フィールド名は要素名で,フィールド値はその要素のもとのテキストを 集めたものとなる。 その要素の属性も独立のDフィールドに変換される。 フィールド名は@属性名であり,フィールド値は属性の値である。 これらは,その要素のフィールドの後ろに置かれる。 (上記例で,imgフィールドの後の@srcフィールド)。
通常,出力フィールド中では,タグは取り除かれ,文字エンティティ("<"等) は,普通の文字("<"等)に戻される。 しかし,-rが指定されるとローモード出力となり, タグは保存され,文字エンティティも&つきの形式となる。
たとえば,入力ファイルに次のような要素があり,
<p><b>Bold</b> & <i>Italic</i>.</p>
この<p>要素がフィールドになる場合,通常では,
p:Bold & Italic.
となる。しかしローモード出力では,
p:<b>Bold</b> & <i>Italic</i>.
となる。
DfromHtmlは,ほとんどの文字セットエンコーディングを扱うことができる。 通常,入力ファイル中のエンコーディングを検出する。 しかし,入力ファイル中に正しいエンコーディング指示がない場合, -eオプションによってエンコーディングを与えなければならない。 使用できるエンコーディング名称は大抵のUNIXでは, iconv -lコマンドで得ることができる。 WINDOWSの場合,エンコーディング名リスト参照のこと。
出力Dファイルはカレントロケールの文字コードで出力される。 ただし,出力にUTF入出力機能が 有効な場合は,指定のUTFで出力される。 出力時,ロケールの文字コードにない文字は,QUESTION MARK(?)に置き換えられる。 (UTF出力の場合はすべて出力される。)
最初に,変換したい内容が本当に入力ファイルの中にあるか確認すること。 ブラウザで見る内容は,そこからダウンロードしたファイルと一致しないこともある。
一般に,入力HTMLファイルがどのような構成になっているか,前もってはわからない。 出力ファイルのnodeフィールドを見て, どのようなxpathを書けばよいかの手がかりを得ることができる。
DfromHtml -p "/html/body/*"
これにより,htmlのbodyの第1レベル要素を知ることができる。 たとえば,
node:/html/body/div[1]
text:
table:
@width:100%
node:/html/body/div[2]
text:
table:Home >
@width:100%
node:/html/body/table
@width:100%
tbody:D is a series of commands to perform .....
node:/html/body/hr
hr:
......
のように出力される。 これを見て,変換したい内容がtableの中にあることがわかれば,次に,
DfromHtml -p "/html/body/table/*"
table要素の場合,当然ほとんどの内容はtbody要素中にあるので さらに,
DfromHtml -p "/html/body/table/tbody/*"
を出力してみる。これを繰り返せば,変換すべき内容にたどり着くことができる。
HTMLのタグは大文字小文字を問わない。 /TBODYでも/tobdyでも同じ結果となる。 ただし,出力DファイルのDフィールド名や nodeフィールドの値では小文字となる。
変換したい部分に特徴的な語があるときは, 他のDコマンドも使ってxpathを見つけることができる。 たとえば,変換したい部分に"Examples"という語があるとしよう。
DfromHtml -p "//*" input-file \
| Dgrep "Examples" \
| Dpr -p node
コマンドは次のようなプリントを出す。
rec# node
1 /html
2 /html/body
3 /html/body/table[5]
4 /html/body/table[5]/tr[16]
5 /html/body/table[5]/tr[16]/td[3]
6 /html/body/table[5]/tr[43]
7 /html/body/table[5]/tr[43]/td[3]
8 /html/body/table[5]/tr[52]
9 /html/body/table[5]/tr[52]/td[3]
10 /html/body/table[5]/tr[81]
11 /html/body/table[5]/tr[81]/td[3]
Xpath式"//*"は,入力中のすべての要素を取り出す。 2番目のDコマンド,Dgrepは,語"Examples"が どこかにあるレコードを取り出す。 3番目のDコマンド,Dprは そのなかのnodeフィールドだけをプリントする。
このプリントを見れば,
-p "/html/body/table[5]/tr"
とするとよさそうだ,という見当がつく。
もっとも単純なDfromHtmlの使用法では文書中のハイパーテキストリンクを そのテキストと属性とともに抽出する。
DfromHtml foo.html
HTMLファイルの(最初の)tableの各列をDレコードに変換する。
DfromHtml "/html/body/table[1]/tbody/tr" foo.html
各ファイルからHTMLのtitleを取り出し, 入力ファイル名とともにレコードにする。
DfromHtml -F -p "/html/head/title" *.html
このマニュアルページのオプションリスト(最初の<dl>要素となっている) を1Dレコードに変換する。
DfromHtml -p "/html/body/dl[1]" DfromHtml.html
<img>要素を抽出する。 出力レコード中@srcフィールドがイメージファイルリストとして使える。
DfromHtml -p //img bar.html
MIYAZAWA Akira