- blogs:
- cles::blog
2010/01/30
[ by hsur at 21:06]
HpricotのXPath実装はちゃんとしてない?
HpricotのXPathの実装が完全でないことは薄々気づいていたものの、新たなライブラリを探すのも面倒だと思ってそのままにしていたのですが、とうとうちゃんと処理できない事例にあたってしまいました。
今回処理をしようとしたのは下記のコード中のようなHTMLから「<h2>aaa111</h2>の直後の<div class="a">の中身のテキストを取り出す」というもの。取り出したいdivにidなんかがついていればいいのですが、ちゃんと構造化されていないHTMLなのでどうしようもありません。
<html>
<head><title>test</title></head>
<body>
<div class="b">001</div>
<h2>aaa111</h2>
<div class="a">002</div>
<div class="b">003</div>
<div class="b">004</div>
<h2>aaa222</h2>
<div class="a">005</div>
<div class="b">006</div>
<div class="b">007</div>
</body>
</html>
<head><title>test</title></head>
<body>
<div class="b">001</div>
<h2>aaa111</h2>
<div class="a">002</div>
<div class="b">003</div>
<div class="b">004</div>
<h2>aaa222</h2>
<div class="a">005</div>
<div class="b">006</div>
<div class="b">007</div>
</body>
</html>
とりあえずノードを指定するXPathである //h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text() はすぐに書けたのですが、Hpricotだと結果がきちんと帰ってきません。どうやらfollowing-siblingが使えないようです。ちなみに同じXPathをNokogiriに食わせるときちんと結果が帰ってくることが確認できたので、これを機にNokogiriに乗り換えてしまうことにしました。
† 検証したコードの例
#!/usr/bin/ruby
require 'rubygems'
require 'nokogiri'
require 'hpricot'
html = <<EOD
<html>
<head><title>test</title></head>
<body>
<div class="b">001</div>
<h2>aaa111</h2>
<div class="a">002</div>
<div class="b">003</div>
<div class="b">004</div>
<h2>aaa222</h2>
<div class="a">005</div>
<div class="b">006</div>
<div class="b">007</div>
</body>
</html>
EOD
noko = Nokogiri::HTML.parse(html)
p noko.xpath("//h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text()")
hpri = Hpricot.parse(html)
p hpri.search("//h2[text() = 'aaa111']")
p hpri.search("//h2[text() = 'aaa111']/following-sibling::div")
p hpri.search("//h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text()")
require 'rubygems'
require 'nokogiri'
require 'hpricot'
html = <<EOD
<html>
<head><title>test</title></head>
<body>
<div class="b">001</div>
<h2>aaa111</h2>
<div class="a">002</div>
<div class="b">003</div>
<div class="b">004</div>
<h2>aaa222</h2>
<div class="a">005</div>
<div class="b">006</div>
<div class="b">007</div>
</body>
</html>
EOD
noko = Nokogiri::HTML.parse(html)
p noko.xpath("//h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text()")
hpri = Hpricot.parse(html)
p hpri.search("//h2[text() = 'aaa111']")
p hpri.search("//h2[text() = 'aaa111']/following-sibling::div")
p hpri.search("//h2[text() = 'aaa111']/following-sibling::div[@class='b'][1]/text()")
† 実行結果
003
#<Hpricot::Elements[{elem <h3> "aaa111" </h3>}]>
#<Hpricot::Elements[]>
#<Hpricot::Elements[]>
#<Hpricot::Elements[{elem <h3> "aaa111" </h3>}]>
#<Hpricot::Elements[]>
#<Hpricot::Elements[]>
このエントリは役に立ちましたか?
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→http://blog.cles.jp/item/3397
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form
OpenID を使ってログインすることができます。
Copyright © 2004-2010 by CLES All Rights Reserved.
sp-20100319202552644595554@cles.net
sp-20100319202552644595554@cles.net
サイト内検索
おしらせ
検索ワード
Tags [All Tags]
google | php | ruby | windows | firefox | linux | SoftwareEngineering | java | spam | ranking | curry | camera | seo | FireEmblem | thunderbird | server | marketing | mobile | Doctoral | docomo
へぇが多いエントリ [Top 100]
- おめでとうございます (4)
- 知恵の輪 サターン編 (3)
- SourceForge.JPのSubversion... (3)
- 人生初の出来事 (3)
- サーバセットアップ (3)
- 和食 小錦 (3)
- .inはインドのccTLDなのか (3)
- 散髪しました (3)
- やっと髪をきりました (3)
- Waterfallプロセスに返れ? (3)
閲覧数が多いエントリ [Top 100]
1 . ドラゴンクエストVIの影響力 [8958x]
2 . やっぱりあった!パクれる読書感想文! [7609x]
3 . Echofon for Firefox [6384x]
4 . OpenIDで自分のサイトのURLを使う [5747x]
5 . 急性胃腸炎 [5739x]
2 . やっぱりあった!パクれる読書感想文! [7609x]
3 . Echofon for Firefox [6384x]
4 . OpenIDで自分のサイトのURLを使う [5747x]
5 . 急性胃腸炎 [5739x]
最新のエントリ [archives]
最新のコメント [Latest 100]
- CD-ROM起動で、HDDを完全消去
- NP_Moblog v1.16
- pinzoro 01/15
- hsur 12/29
- and more...
- 耳がおかしいと思ったら突発..
- baca 01/13
- hsur 01/13
- and more...
カテゴリ別エントリ
cles::blogについて
Syndicate
Calendar
Referrers
Blog People
Admin
★はてな認証APIをつかってログインすることができます。
Powered by NP_Paint




