2010年10月10日

スクレイピング自前でやろうっと

前回までスクレイピング用のPHPライブラリ使ってWikiを解析しようとしてたけど、やっぱり自前で正規表現でやることにした。という話。
 
と、いうのも、以下のような条件をXPathでスマートに指定することができなかったから

<h3>...</h3>と<hr />の間にある<td>や<li>や<pre>に囲まれた文字列を取り出す
ただし、<h3>と<hr />の間に何も存在しなければ、なんの文字列も取り出さない

スクレイピング用ライブラリはいずれも、htmlを整形式のXMLに変換してお気楽に取り出せるようにしたもの。それはそれで汎用性高いんだけど、↑のような条件をXPathでいざ現そうとすると・・・

  1. コンテキストノードを//h3にする
  2. following-sibling::pre または following-sibling::ul/li または following-sibling::table/tr/td を選択
  3. following-sibling::hr があるかどうか確認

というむちゃくちゃ難しいXPathを設定し、しかも

<h3>テスト1</h3>
<hr /> ←テスト1配下には何も無い要素
<h3>テスト2</h3>
<ul>
  <li>項目1</li>
  <li>項目2</li>
</ul>
<hr />

こういう場合、テスト1配下に項目1、2があると判定してしまう。
というのをどうしても回避することができなかった

うーん、くやしい。XPath自由自在に操れるようになったらすげぇカッコいいのに。

で、こういうのは正規表現で

/<h3.+<hr[^>]*>/

こんなふうに切りだして、さらにマッチした中身の文字列を正規表現でもう一度切り出したほうがだった〜

う〜ん泥臭い
posted by LoyalTouch at 22:40| Comment(0) | TrackBack(0) | ダンジョンスペシャル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック