Web::Scraperの使い方で
PerllのWeb::Scraperを使って商品の情報を取得するみたいなことをしたいのですが、下のコードでなぜかブランドと製造販売元が取得することができません。
http://www.kenko.com/product/item/itm_6521067072.htmlのソースを見てみると、<div class="ltxt brand">にブランド情報が、<div class="ltxt">に製造販売元の情報が書かれています。それなので、process "div.ltxt", "maker" => "TEXT";とすれば製造販売元の情報(文字列)が取得されるはずなのですが、なぜかブランド情報(process "div.ltxt.brand", "brand" => "TEXT";として得られるはず?)が得られてます。これはなぜでしょうか?
またこのスクリプトWeb::Scraperでは基本的にclass="***"のようにクラスの定義がされていないものについては情報を取得できないのでしょうか?例えば、同ページのソースコードにある<div>内容量:250ml</div>や<div itemprop="identifier" content="upc:4987222787413">JANコード: 4987222787413</div>から内容量とJANコードの情報を得ることはできないでしょうか?
#!usr/bin/perl
use strict;
use warnings;
use Encode;
use Web::Scraper;
use URI;
use utf8;
binmode STDOUT, ":encoding(shiftjis)";
#scraperオブジェクトを作成
my $shinkan = scraper{
#processメソッドで抽出する要素と展開方法を指定
process "div.mainBox","fil_list[]"=> scraper{
#scraperメソッドを渡して,"td.c-table01"要素をさらに展開する
process "h1.fn", "goods" => "TEXT"; # 商品名
process "div.ltxt.brand", "brand" => "TEXT"; # ブランド
process "div.ltxt", "maker" => "TEXT"; # メーカー
process "span.price" => "price" => "TEXT"; # 価格
};
};
#scrapeメソッドでスクレイピングを実行
my $res = $shinkan->scrape(URI->new("http://www.kenko.com/product/item/itm_6521067072.html"));
foreach my $dat(@{$res->{fil_list}}){
#undefの場合は、""を代入する。
unless(defined($dat->{goods})) {$dat->{goods} = ""};
unless(defined($dat->{brand})){$dat->{brand} = ""};
unless(defined($dat->{maker})) {$dat->{maker} = ""};
unless(defined($dat->{price})){$dat->{price} = ""};
print "goods = ", $dat->{goods}, "\n";
print "brand = ", $dat->{brand}, "\n";
print "maker = ", $dat->{maker}, "\n";
print "price = ", $dat->{price}, "\n";
};
お礼
TarChangさん、ありがとうございます! そうなんですよね・・・。 電話で問い合わせて、って言っても説明するのも難しいし・・・と思いまして。