クロール結果変換方法
S2Robot では、クロールした結果を期待した形に変換することができます。 変換には、Transformer インターフェースを実装したコンポーネントを登録します。
標準では、以下の Transformer があります。
- BinaryTransformer: ウェブコンテンツをバイナリで AccessResultData に保存します。 画像などのバイナリデータを保存したい場合に便利です。 この Transformer が適用された場合は、この URL 以下の子 URL はクロールしません。
- FileTransformer: クロール結果をファイルとして保存します。 AccessResultData には保存したファイル名が登録されます。 クロールしたファイルが HTML の場合は、子の URL をクロールします。
- HtmlTransformer: クロールした結果を AccessResultData に保存します。 HTML を AccessResult の結果として扱いたい場合に利用します。 バイナリなどは保存できません。 クロールしたファイルが HTML の場合は、子の URL をクロールします。
- XpathTransformer: クロールした結果を XPath で指定した部分だけを抽出して AccessResultData に保存します。 クロールしたファイルが HTML の場合は、子の URL をクロールします。
設定方法
Transformer を追加する場合は、s2robot_transformer.dicon を作成してその中で定義します。 s2robot_transformer.dicon は s2robot_rule.dicon で include されます。 標準の s2robot_transformer.dicon は以下のように s2robot_transformer_basic.dicon を include しています。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="s2robot_transformer_basic.dicon"/>
</components>
s2robot_transformer_basic.dicon は標準で利用可能な Transformer を定義しています。 このファイルは特に作成する必要はありません。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component name="binaryTransformer" class="org.seasar.robot.transformer.impl.BinaryTransformer" instance="singleton">
<property name="name">"binaryTransformer"</property>
</component>
<component name="defaultFeatureMap" class="java.util.LinkedHashMap">
<initMethod name="put">
<arg>"http://xml.org/sax/features/namespaces"</arg>
<arg>"false"</arg>
</initMethod>
</component>
<component name="defaultPropertyMap" class="java.util.LinkedHashMap">
</component>
<component name="allChildUrlRuleMap" class="java.util.LinkedHashMap">
<initMethod name="put">
<arg>"//A"</arg>
<arg>"href"</arg>
</initMethod>
<initMethod name="put">
<arg>"//AREA"</arg>
<arg>"href"</arg>
</initMethod>
<initMethod name="put">
<arg>"//FRAME"</arg>
<arg>"src"</arg>
</initMethod>
<initMethod name="put">
<arg>"//IFRAME"</arg>
<arg>"src"</arg>
</initMethod>
<initMethod name="put">
<arg>"//IMG"</arg>
<arg>"src"</arg>
</initMethod>
<initMethod name="put">
<arg>"//LINK"</arg>
<arg>"href"</arg>
</initMethod>
<initMethod name="put">
<arg>"//SCRIPT"</arg>
<arg>"src"</arg>
</initMethod>
</component>
<component name="htmlUrlRuleMap" class="java.util.LinkedHashMap">
<initMethod name="put">
<arg>"//A"</arg>
<arg>"href"</arg>
</initMethod>
<initMethod name="put">
<arg>"//AREA"</arg>
<arg>"href"</arg>
</initMethod>
<initMethod name="put">
<arg>"//FRAME"</arg>
<arg>"src"</arg>
</initMethod>
<initMethod name="put">
<arg>"//IFRAME"</arg>
<arg>"src"</arg>
</initMethod>
</component>
<component name="fileTransformer" class="org.seasar.robot.transformer.impl.FileTransformer" instance="singleton">
<property name="name">"fileTransformer"</property>
<property name="featureMap">defaultFeatureMap</property>
<property name="propertyMap">defaultPropertyMap</property>
<property name="childUrlRuleMap">allChildUrlRuleMap</property>
</component>
<component name="htmlTransformer" class="org.seasar.robot.transformer.impl.HtmlTransformer" instance="singleton">
<property name="name">"htmlTransformer"</property>
<property name="featureMap">defaultFeatureMap</property>
<property name="propertyMap">defaultPropertyMap</property>
<property name="childUrlRuleMap">allChildUrlRuleMap</property>
</component>
<component name="htmlOnlyTransformer" class="org.seasar.robot.transformer.impl.HtmlTransformer" instance="singleton">
<property name="name">"htmlTransformer"</property>
<property name="featureMap">defaultFeatureMap</property>
<property name="propertyMap">defaultPropertyMap</property>
<property name="childUrlRuleMap">htmlUrlRuleMap</property>
</component>
</components>
例えば、XpathTransformer を使用して、title タグと body タグ以下の内容を抽出して AccessResultData に保存したい場合は、s2robot_transformer.dicon を以下のようにします。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="s2robot_transformer_basic.dicon"/>
<component name="xpathTransformer" class="org.seasar.robot.transformer.impl.XpathTransformer" instance="singleton">
<property name="name">"htmlTransformer"</property>
<property name="featureMap">defaultFeatureMap</property>
<property name="propertyMap">defaultPropertyMap</property>
<property name="childUrlRuleMap">htmlUrlRuleMap</property>
<initMethod name="addFieldRule">
<arg>"title"</arg>
<arg>"//TITLE"</arg>
</initMethod>
<initMethod name="addFieldRule">
<arg>"body"</arg>
<arg>"//BODY"</arg>
</initMethod>
</component>
</components>
AccessResultData に保存されるデータは以下のようになります。
<?xml version="1.0"?> <doc> <field name="title">タイトル</field> <field name="body">第一章 第一節 ほげほげふがふが LINK 第2章 第2節</field> </doc>
