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

解決済みの質問

Perl  スクレイピング処理について

以下のような構成のページから、前半2つの twitter ,facebook のみを
  process '#share_item ul li', 't_url' => '@href';
のような形で抜き出したいのですが、
これだとtwitterからmixi までの情報を一気に取得してしまいます。

process '#share_item ul li', 'twi_url' => '@href';
process '#share_item ul li', 'fb_url' => '@href';

のように、それぞれ分けて取得するよい方法はありますでしょうか?

----------(ここから)---------
<div id="share_item">
<ul>
<li>
<a href="http://twitter.com/share?text=(略)&via=test_mk" target="_blank" onclick="s_omni.trackSNS('twitter')">
<img src="http://aaa.com/btn1.gif" alt="twitterでつぶやく" />
</a>
</li>

<li>
<a href="http://www.facebook.com/share.php?u=http://aaa.com/" target="_blank" onclick="s_omni.trackSNS('facebook')"><img src="http://www.aaa.com/common/btn2.gif" alt="facebookでシェア" /></a>
</li>
<li>
<a href="mailto:?subject=
                ~(略)~alt="
              メールで知らせる" />
              </a>
</li>
<li>
<a href="http://mixi.jp/recent_voice.pl?from=home_profile" target="_blank" onclick="s_omni.trackSNS('mixi')">
<img src="http://aaa.com/btn4.gif" alt="mixiで知らせる" /></a>
</li>
<li>
<link rel="mixi-check-image" type="image/jpeg" href="http://aaa.com//img/site/3.jpg" />
<a href="javascript:void(0);" onclick="window.open('http://mixi.jp/share.pl?u=http://aaa.com/&k=cf6870bacc04932deb167c0ee0483894cf74249b','share',['width=632','height=456','location=yes','resizable=yes','toolbar=no','menubar=no','scrollbars=no','status=no'].join(','));"><img src="http://aaa.com/btn5.gif" alt="mixiチェック"></a>
</li>
</ul>
</div>
----------(ここまで)---------


(2)これは補足的な質問なのですが、
「#share_item ul li」
のように # がつく記述と付かないパターンがあるのですが、
この違い(#が必要な時)が不明です。
ご存知の方、教えて頂ければ幸いです。

投稿日時 - 2011-08-25 16:54:46

QNo.6966851

すぐに回答ほしいです

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

表示がくずれので空白2文字を全角空白にしていることに注意。

use strict;
use warnings;
use utf8;
use Web::Scraper;
use Data::Dumper;

my $html = << 'END_HTML';
<html>
 <head>
 </head>
 <body>
  <div id="share_item">
   <ul>
    <li>
     <a href="http://twitter.com/share?text=xxx&via=test_mk" target="_blank" onclick="s_omni.trackSNS('twitter')">twitter</a>
    </li>
    <li>
     <a href="http://www.facebook.com/share.php?u=http://aaa.c" target="_blank" onclick="s_omni.trackSNS('facebook')">face book</a>
    </li>
    <li>
    </li>
    <li>
     <link rel="mixi-check-image" type="image/jpeg" href="http://aaa.com//img/site/3.jpg" />
     <a href="javascript:void(0);"
       onclick="window.open('http://mixi.jp/share.pl?u=http://aaa.com/&k=cf68"
       src="http://aaa.com/btn5.gif" alt="mixiチェック">mixi</a>
    </li>
   </ul>
  </body>
 </html>
END_HTML

my $scraper = scraper {
  process '#share_item ul li a[href^="http://twitter.com/"]', 'twi_url' => '@href';
  process '#share_item ul li a[href^="http://www.facebook.com/"]', 'fb_url' => '@href';
};
my $res = $scraper->scrape($html) || die "$!";

print Dumper($res);
# $VAR1 = {
#      'twi_url' => 'http://twitter.com/share?text=xxx&via=test_mk',
#      'fb_url' => 'http://www.facebook.com/share.php?u=http://aaa.c target='
#     };


> 「#share_item ul li」
> のように # がつく記述と付かないパターンがあるのですが、
> この違い(#が必要な時)が不明です。

「CSS 一意セレクタ」で調べてみて下さい。

投稿日時 - 2011-08-25 22:09:26

補足

ご回答頂き、誠にありがとうございました。

a[href^="http://twitter.com/ で、href の行頭が「http://twitter.com/」の
データを抜き取る方法ということですね。

私の環境で、全く同じ内容で試してみたのですが
process '#share_item ul li a[href^="http://twitter.com/"]', 'twi_url' => '@href';
を実行すると、↓
--------------------------------------
'//*[@id='share_item']//ul//li//a[@href^='http://twitter.com/']' doesn't look like a valid XPath expression: Query:
//*[@id='share_item']//ul//li//a[@href^='http:...
.....................................^^^
Invalid query somewhere around here (I think)
--------------------------------------

のようにXpath の形式が異なると言われ、正常に取得できませんでした。

投稿日時 - 2011-08-26 10:12:08

お礼

ご回答ありがとうございました!

頂きました回答を基に、なんとか取得することができました。

投稿日時 - 2011-08-30 18:21:48

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

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

-広告-
-広告-

回答(2)

ANo.2

たぶん、Web::Scraperで使われているHTML::Selector::XPathが古いです。

投稿日時 - 2011-08-27 16:25:03

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-