[ruby-list:46441] Hpricot#search の使い方

View: New views
6 Messages — Rating Filter:   Alert me  

[ruby-list:46441] Hpricot#search の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

そえじまです。


Hpricot#search の使い方を教えていただけないでしょうか?

doc = Hpricot(open("http://hoge.example.com"))

として、ページを取得した後、ページ内に複数の <span> タグがある中で

<span id="abc_999">huga</span>

のhugaをidで狙い撃ちして取得するにはどのように記述するのがよいのでしょうか?

#id ではなく、class だと span.class で取得できるのは分かったのですが・・・

どなたかご教示いただけると幸いです。
よろしくお願い致します。




Parent Message unknown [ruby-list:46443] Re: Hpricot#search の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

るびきちさま、夜中に関わらずありがとうございます。

るびきちさまのサンプルは問題なく動作したのですが
私の目的のサイトからはnilになってしまいます。

*********************************
require 'rubygems'
require 'open-uri'
require 'hpricot'

doc = Hpricot(open("http://finance.yahoo.com/q?s=EURJPY=X"))
p doc.search("span#yfs_l10_eurjpy=x") #=> #<Hpricot::Elements[]>
**********************************

という感じでオブジェクトが空になってしまいます。
idが間違ってるのかと思い、何回もページのソースを確認したりしたの
ですが、どうも間違いが見当たらなくて困惑しております。

この2行のコードの中に何か間違いはあるでしょうか?
恐縮ですがご教示いただけると幸いです。




> #!/usr/local/bin/ruby187
> # -*- coding: utf-8 -*-
> require 'hpricot'
> doc = Hpricot(DATA)             # __END__以下の内容を読み込む
> # id="abc_999"なspanすべて
> doc.search("span#abc_999")
> # => #<Hpricot::Elements[{elem <span id="abc_999"> "huga" </span>}]>
> # id="abc_999"な最初のspan
> doc.at("span#abc_999")
> # => {elem <span id="abc_999"> "huga" </span>}
> # 内容がhugaな最初のspan
> doc.search("span").detect {|e| e.inner_text == 'huga' }
> # => {elem <span id="abc_999"> "huga" </span>}
>
> __END__
> <html><body>
> <span id="abc_1">hoge</span>
> <span id="abc_999">huga</span>
> </body></html>
>
>
> # HTMLパーサはNokogiriを使うのが主流になるでしょう。Ruby 1.9にも対応していますし。
>
> --
> rubikitch
> Blog: http://d.hatena.ne.jp/rubikitch/
> Site: http://www.rubyist.net/~rubikitch/
> Twit: http://twitter.com/rubikitch/
> 『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook
>
>
>  



[ruby-list:46444] Re: Hpricot#search の使い方

by okkez :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

okkez です。

2009年10月9日6:20 T.Soejima <clev@...>:

> るびきちさま、夜中に関わらずありがとうございます。
>
> るびきちさまのサンプルは問題なく動作したのですが
> 私の目的のサイトからはnilになってしまいます。
>
> *********************************
> require 'rubygems'
> require 'open-uri'
> require 'hpricot'
>
> doc = Hpricot(open("http://finance.yahoo.com/q?s=EURJPY=X"))
> p doc.search("span#yfs_l10_eurjpy=x") #=> #<Hpricot::Elements[]>
> **********************************
>
> という感じでオブジェクトが空になってしまいます。
> idが間違ってるのかと思い、何回もページのソースを確認したりしたの
> ですが、どうも間違いが見当たらなくて困惑しております。
>
> この2行のコードの中に何か間違いはあるでしょうか?
> 恐縮ですがご教示いただけると幸いです。
>

おそらくコードは間違ってませんが、html が間違ってます。
http://www.w3.org/TR/REC-html40/types.html#type-name によると
id, name に使用できるのは /\A[a-zA-Z][a-zA-Z0-9\-_:.]*/ です。
"=" や "^" は id には使えません。

nokogiri でも軽く試して見ましたが、search メソッド呼び出し時に id に "=" が
入っていると Nokogiri::CSS::SyntaxError になりました。
id を使わない方法で検索条件を指定すると問題なく動きました。

--
okkez
okkez000@...


[ruby-list:46445] Re: Hpricot#search の使い方

by OZAWA Sakuro-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

さくです。

= は id には使えない文字(yahooのHTMLの文法違反)なので、解析に失敗しているような。
試しに _ に置換してからHpricotで処理したら、拾えました。

doc  / 'span#yfs_l10_eurjpy_x'
=> #<Hpricot::Elements[{elem <span id="yfs_l10_eurjpy_x"> "131.04"
</span>}, {elem <span id="yfs_l10_eurjpy_x"> "131.04" </span>}]>

2009年10月9日6:20 T.Soejima <clev@...>:

> doc = Hpricot(open("http://finance.yahoo.com/q?s=EURJPY=X"))
> p doc.search("span#yfs_l10_eurjpy=x") #=> #<Hpricot::Elements[]>

--
OZAWA Sakuro

"The future will be better tomorrow." --Dan Quayle


[ruby-list:46446] Re: Hpricot#search の使い方

by Seiichi Miyagawa :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Mt.Trailです

| おそらくコードは間違ってませんが、html が間違ってます。
| http://www.w3.org/TR/REC-html40/types.html#type-name によると
| id, name に使用できるのは /\A[a-zA-Z][a-zA-Z0-9\-_:.]*/ です。
| "=" や "^" は id には使えません。
|
| nokogiri でも軽く試して見ましたが、search メソッド呼び出し時に id に "=" が
| 入っていると Nokogiri::CSS::SyntaxError になりました。
| id を使わない方法で検索条件を指定すると問題なく動きました。

XPath形式だとHpricotでもNokogiriでも取れるようです。

p doc.search("//span[@id='yfs_l10_eurjpy=x']")

#<Hpricot::Elements[{elem <span id="yfs_l10_eurjpy=x"> "131.03" </span>},
{elem <span id="yfs_l10_eurjpy=x"> "131.03" </span>}]>



[ruby-list:46447] Re: Hpricot#search の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

そえじまです。

okkezさま、さくさま。
お忙しいところ、原因のご教示ありがとうございました。m(__)m
そんな落とし穴があるとは、全く想像していませんでした。
徹夜で悩んでたので、大変助かりました。

Mt.Trail さま
XPath形式というものの使い方を教えていただき、ありがとうございます。
全くもって勉強不足を痛感しております。m(__)m
当初は仕方ないので文字列に変換してゴリっとするしかないのかと思って
諦めていたところでしたので、大変助かりました。


るびきちさま始め、深夜早朝にご教示いただいた皆様に感謝いたします。

> | おそらくコードは間違ってませんが、html が間違ってます。
> | http://www.w3.org/TR/REC-html40/types.html#type-name によると
> | id, name に使用できるのは /\A[a-zA-Z][a-zA-Z0-9\-_:.]*/ です。
> | "=" や "^" は id には使えません。
> |
> | nokogiri でも軽く試して見ましたが、search メソッド呼び出し時に id に "=" が
> | 入っていると Nokogiri::CSS::SyntaxError になりました。
> | id を使わない方法で検索条件を指定すると問題なく動きました。
>
> XPath形式だとHpricotでもNokogiriでも取れるようです。
>
> p doc.search("//span[@id='yfs_l10_eurjpy=x']")
>
> #<Hpricot::Elements[{elem <span id="yfs_l10_eurjpy=x"> "131.03" </span>},
> {elem <span id="yfs_l10_eurjpy=x"> "131.03" </span>}]>
>
>
>
>