DfromHtml - HtmlからDレコードの抽出

[ 英語 | 日本語 ]

[Dホームページへ]

形式

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"は,ヘッダ中のメタデータを選択する。

Dレコード出力

省略時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フィールド)。

ローモード出力

通常,出力フィールド中では,タグは取り除かれ,文字エンティティ("&lt;"等) は,普通の文字("<"等)に戻される。 しかし,-rが指定されるとローモード出力となり, タグは保存され,文字エンティティも&つきの形式となる。

たとえば,入力ファイルに次のような要素があり,

<p><b>Bold</b> &amp; <i>Italic</i>.</p>

この<p>要素がフィールドになる場合,通常では,

p:Bold & Italic.

となる。しかしローモード出力では,

p:<b>Bold</b> &amp; <i>Italic</i>.

となる。

文字セットとロケール

DfromHtmlは,ほとんどの文字セットエンコーディングを扱うことができる。 通常,入力ファイル中のエンコーディングを検出する。 しかし,入力ファイル中に正しいエンコーディング指示がない場合, -eオプションによってエンコーディングを与えなければならない。 使用できるエンコーディング名称は大抵のUNIXでは, iconv -lコマンドで得ることができる。 WINDOWSの場合,エンコーディング名リスト参照のこと。

出力Dファイルはカレントロケールの文字コードで出力される。 ただし,出力にUTF入出力機能が 有効な場合は,指定のUTFで出力される。 出力時,ロケールの文字コードにない文字は,QUESTION MARK(?)に置き換えられる。 (UTF出力の場合はすべて出力される。)

xpathの見つけ方 (1)

最初に,変換したい内容が本当に入力ファイルの中にあるか確認すること。 ブラウザで見る内容は,そこからダウンロードしたファイルと一致しないこともある。

一般に,入力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フィールドの値では小文字となる。

xpathの見つけ方 (2)

変換したい部分に特徴的な語があるときは, 他の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"

とするとよさそうだ,という見当がつく。

オプション

-p xpath
要素を選択するXpath式。 省略時は,"//a/@href/.."で,すべてのhref属性を持ったアンカー要素が選択される。 HTMLのXpath式は大小文字を問わない。
-e
入力ファイルのエンコーディング。 文字セットとロケール節参照。
-F
レコードの入力ファイル名を
"filename"フィールドに出力。
-n newline-replacement
改行制御文字を代替する文字列を指定する。 このオプションの指定がない場合,NULL文字列となる。 (改行制御文字は単に除去される)。
-r
ローモード出力; ローモード出力参照。
-D odatautf=8|16|32
UTF出力(UTF入出力機能参照)。
idatautfは無視される。

既定フィールド名

filename:
-Fオプションが指定されたとき, 各レコードの先頭のフィールドとして。 値はそのレコードの入力ファイル名で,シェルにより展開された形をしている。 ただし,入力が標準入力の場合,このフィールドは付加されない。
node:
他のフィールドの前で,もしあれば,filenameフィールドの後ろ。 要素を示すxpath。
text:
選択された要素の直接のテキスト。
comment:
選択された要素の直下にコメントがある場合。

使用例

もっとも単純な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

環境変数

Dodatautf
for UTF入出力機能参照。
Didatautfは無視される。

メッセージ

マニュアル D_msg参照。

このほか,HTML構文解析と,XPATH処理系からのメッセージが 出力されうる。これらについては,libxml2のマニュアル参照。

参照

DintroDfromXml, DtoXmlD_msg

AUTHOR

MIYAZAWA Akira


miyazawa@nii.ac.jp
2006