DfromHtml - Htmlから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