[#46647] RubyでWindowsの常駐サービスプログラムを作る方法 — kouichi_someya@...

はじめまして。

12 messages 2009/12/16
[#46649] Re: RubyでWindowsの常駐サービスプログラムを作る方法 — "U.Nakamura" <usa@...> 2009/12/17

こんにちは、なかむら(う)です。

[ruby-list:46659] Re: xpathについて

From: Soichi Ishida <zau_777_emacs@...>
Date: 2009-12-17 05:14:55 UTC
List: ruby-list #46659
ご返事ありがとうございます。

今更ですが
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux-lp]
gem1.8 -v
1.3.5
 gem1.8 list nokogiri
*** LOCAL GEMS ***
nokogiri (1.4.0)

一つエントリを取得するのは成功しました。
--------------------
#! ruby -Ke
require 'rubygems'
require 'open-uri'
require 'nokogiri'
url = "http://www11.ocn.ne.jp/~kui168/link37.html"
doc = Nokogiri::HTML(open(url).read)
p xpath = doc.xpath("/html/body/div[@id='Layer2']/table/tbody/tr[2]/td[1]/b/font/font").text()
--------------------

Firefoxのxpather便利ですね。ビックリしました。

今度はループで全部取得したいわけですが、どうやら二ヶ所指定が必要みたいです。

'Layer#{num}'
tr[#{num}]

そして最後の /font/font が /font だけだったり…

とりあえず片方だけループしてみたんですが
--------------------
#! ruby -Ke
require 'rubygems'
require 'open-uri'
require 'nokogiri'
url = "http://www11.ocn.ne.jp/~kui168/link37.html"
vals = []
doc = Nokogiri::HTML(open(url).read)
i = 0
doc.xpath("/html/body/div[@id='Layer#{i}']/table/tbody/tr[2]/td[1]/b/font/font").each do |entry, i|
  vals << entry.text()
end

p vals
--------------------
もちろんダメです(汗)配列は空っぽです。とくにxpathの最後の部分はどう処理するか検討もつきません。

助言お願い致します。

soichi


okkez <okkez000@gmail.com> writes:

> okkez です。
>
> 2009年12月17日9:17 Soichi Ishida <zau_777_emacs@kki.biglobe.ne.jp>:
>>
>> soichi です。
>>
>> ruby 1.8.6
>> ubuntu 8.04
>> です。
>
> この情報よりも ruby -v の実行結果を貼ってもらった方が助かります。
> また使用しているライブラリのバージョンもあるとより良いです。
> gem -v
> gem list nokogiri
> など。
> # 特に Nokogiri は最近、新しいバージョンがリリースされたばかりなので。
>
>>
>> 先日は失礼しました。勉強不足でした。
>> xpathに関して質問させてください。
>>
>> http://www11.ocn.ne.jp/~kui168/link37.html
>>
>> のページから東証一部の企業データベースを作るために、企業コードと企業名、そして種類(水産、機械など)を取り出したいと思います。(CSVファイルは探せばあるんですが、自分のRuby とHTMLの勉強のためにやってます。)
>>
>> 最終的にはdo end ループでhtmlの枝先を集めていくんでしょうが、最初の一つだけを拾ってみようとこんな感じにしてみましたが、まったくダメです。
>> --------------------
>> require 'rubygems'
>> require 'open-uri'
>> require 'nokogiri'
>> require 'kconv'
>> $KCODE = "utf8"
>> url = "http://www11.ocn.ne.jp/~kui168/link37.html"
>>
>> doc = Nokogiri::HTML(open(url).read.toutf8)
>> xpath = doc.at('/TABLE/TBODY/TR')   #ここで最初の一つを取り出せるかと思ったんです
>> p doc.xpath(xpath).text()
>> --------------------
>
>
> xpath は関係ないです。
> Nokogiri は charset を見て(?)自動的に文字コードを変換してくれるので toutf8 が不要です。
> # 読み込んだ html に charset 指定があればですが。
>
> つまり今回は読もうとした文字列の文字コードと html に指定されていた charset が異なっているので
> 意図どおりにパース出来ていませんでした。(正しいオブジェクトができていなかった)
>
>>
>> まず、xpath の指定なんですが、
>> /TABLE/TBODY/TR
>>  か
>> /TABLE/TBODY/TR/TD
>> かで迷います。どちらも出来なんですが(汗)
>
> どっちも間違ってます。
> //table[1]/tbody/tr[1]/td[1] とか //div[@id='Layer2']/table/tr[1]/td[1]
> とかじゃないでしょうか。
> # xpather などの Firefox addon を使うと簡単に xpath を確認できます。
>
> Layer2 の部分を変えていけばすべての種類について情報を得ることができると思います。
>
>
>
> -- 
> okkez
> okkez000@gmail.com

In This Thread