みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PerlのWeb::Scraperと正規表現について教えてください。

以下のスクリプトで困ってます。質問をスクリプトの下に書きましたので、よろしくお願いします。
#------------------------------------------------------------------
#!C:/strawberry/perl/bin/perl
use strict;
use Web::Scraper;
use URI;
use YAML;
use encoding 'shiftjis';


my $stuff = URI->new("http://table.yahoo.co.jp/t?s=9503.t&a=5&b=13&c=2009&d=8&e=14&f=2009");
my $scraper = scraper {
process "table table table tr td small", 'news[]' => { title1 => 'text' };
};
my $result = $scraper->scrape($stuff);


print YAML::Dump $result;

#------------------------------------------------------------------

上記のPerlスクリプトでは、
---
news:
- title1: 年
- title1: 月
- title1: 日
- title1: から
- title1: までのデータ
- title1: デイリー
- title1: 週間
- title1: 月間
- title1: '銘柄コード: '
- title1: 2009年8月14日
- title1: '2,075'
- title1: '2,090'
- title1: '2,070'
- title1: '2,080'
- title1: '1,449,300'
- title1: '2,080'
- title1: 2009年8月13日
- title1: '2,090'
- title1: '2,090'
- title1: '2,080'
- title1: '2,090'
- title1: '1,137,900'
- title1: '2,090'

のような結果が出ます。
結果を以下のようにCSVで取り出したいのですが、ロジックをどのように変更すればよいでしょうか? 
多分正規表現を使うんだと思うのですが、分かりません。
http://weblog.nqou.net/archives/20090301140728.html
↑このページも確認していろいろ試しましたが、上手くいきません。
ご指導よろしくお願いします。

こういう↓結果にしたいです。
2009年8月14日,2075,2090,2070,2080,1449300,2080
2009年8月13日,2090,2090,2080,2090,1137900,2090

以上

投稿日時 - 2009-08-16 19:30:01

QNo.5212131

困ってます

質問者が選んだベストアンサー

もうちょっと、シンプルに書けると思うけど、とりあえず
#!/usr/bin/perl
use warnings;
use strict;
use Encode;
use URI;
use Web::Scraper;

my $uri_str = shift
|| 'http://table.yahoo.co.jp/t?s=9503.t&a=5&b=13&c=2009&d=8&e=14&f=2009%22%20%3B%22#6197153243450676860';
my $uri = new URI($uri_str) || die "$uri_str:$!";

my $scraper = scraper {
process 'table tr[bgcolor="#ffffff"]', 'records[]' => scraper {
process 'small', 'items[]' => 'TEXT';
};
};

my $res = $scraper->scrape($uri) || die "$!";

binmode STDOUT, ":encoding(shift-jis)";
foreach my $record ( @{ $res->{records} } ) {
foreach my $item ( @{ $record->{items} } ) {
$item =~ tr/,//d;
print $item, ',';
}
print "\n";
}

投稿日時 - 2009-08-17 20:58:24

補足

忙しいところ、ありがとうございます。
早速試してみたのですが、以下のエラーが出ます。
どうすればよいでしょうか?
ご指導お願いします。

エラー

syntax error at bbb.pl line 10, near "my "
Global symbol "$uri" requires explicit package name at bbb.pl line 10.
Global symbol "$uri_str" requires explicit package name at bbb.pl line 10.
Global symbol "$uri_str" requires explicit package name at bbb.pl line 10.
Global symbol "$uri" requires explicit package name at bbb.pl line 18.
Execution of bbb.pl aborted due to compilation errors.

投稿日時 - 2009-08-18 06:36:01

お礼

上記補足は誤りでした。
思ったとおりの結果が出ました。
ありがとうございます。

ロジックの中身について、追加で教えて欲しいのですが、
スクレイピングしたいURLの後ろ2009のあとの部分は
どういう意味があるのでしょうか?

2009" ;"#6197153243450676860';

お時間のあるときでけっこうですので、よろしくお願いします。

投稿日時 - 2009-08-18 21:34:27

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

投稿されたコードのURIをマウスオーバすると、 リンク情報が
http://....2009);
と表示されて、コピベしたときに2009以降にゴミがついたのでしょう。それ
でも開けてしまうのは、yahooがf=2009以降のクエリーをつかっていないから
だと思われます。

なので、2009" ;"#6197153243450676860';の2009以降は意味がなくて、
正しいURIを指定すればOKということです。

投稿日時 - 2009-08-19 03:57:01

お礼

いろいろと教えてもらって、ありがとうございます。

非常に助かりました。

後は、ファイルの読み込みとか、書き込みとか自分で

勉強してみます。

ダメだったら、また質問させてもらいますので、

機会があれば、よろしくお願いします。

投稿日時 - 2009-08-19 20:14:06

あなたにオススメの質問