2012年7月6日金曜日

Yahoo Pipes でXPath で指定した要素の直下にあるテキストを取得するためのパイプ - ノードテスト text() の代わりに content 属性を用いる

1. XPath のノードテスト text() でテキストを抽出する

XPath で HTML のタグで囲まれたテキストを取得するには、ノードテスト text() を利用する。

XML Path Language – Wikipedia によると、

text()

全てのテキスト (文字列) ノードを指定する。例: <k>こんにちは</k> の中の 'こんにちは'

例えば、Yahoo!Pipesのテスト のページにおいて、

<div name="hogepiyofuga">
<p>ほげ</p>
<p><b>ぴ</b>よ</p>
<p>ふが</p>
</div>

以下の XPath を指定すると、

//div[@name="hogepiyofuga"]/p/text()

タグで囲まれたテキストが抽出できる。

SnapCrab_NoName_2012-7-6_0-51-32_No-00

 

2. Yahoo! Pipes でテキストを取得するには content 属性を利用する

Yahoo! Pipes には、XPath を指定できる XPath Fetch Page モジュールがある。

しかし、XPath Fetch Page モジュールの Extract using XPath フィールドに、ノードテスト text() を指定すると、

//div[@name="hogepiyofuga"]/p/text()

結果が出力されない。どうやら、単一の値を返せないようだ

ノードテスト text() を指定しない場合、

//div[@name="hogepiyofuga"]/p

パイプの content 属性に、ノードテスト text() で抽出したときと同じテキストが設定される。

SnapCrab_NoName_2012-7-6_1-20-46_No-00

ここでは、XPath Fetch Page モジュールにおいて、Use HTML5 parser にチェックを入れた。なぜなら、このパーサを使うことが推奨されているため。

New Module: XPATH Fetch Page | Yahoo! Pipes Blog によると、

Currently this module will extract the page and fix malformed tags using Tidy. You have the option to run the parser using support for HTML4 (by default) or checking the “Use HTML5 parser” checkbox to use the HTML5 parser. We recommend using the HTML5 parser when using this module for most cases.

 

sub-element モジュール

上記より、content 属性だけを抽出したい場合、

  • Operator > Sub-element モジュール

を使い、item.content を指定する。

SnapCrab_NoName_2012-7-6_1-38-56_No-00

これにより、XPath で指定した要素の直下にあるテキストを抽出できる。

以上より、XPath で指定した要素の直下にあるテキストを取得するためのパイプを作成しておく。

 

3. XPath で全てのテキストを抽出する

ところで、XPath では、指定した要素の子孫に当たるテキストを選択することはできる。

//div[@name="hogepiyofuga"]/p//text()

先ほどと違い、「ぴよ」の「ぴ」も抽出された。

SnapCrab_NoName_2012-7-6_1-48-40_No-00

Yahoo! Pipes で、同じ動作をするパイプを作ることは難しいようだ。