• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[LWP?] 特定のCLASSの値だけ取得したい)

[LWP?] 特定のCLASSの値だけ取得したい

このQ&Aのポイント
  • LWPを使って特定のWebページの内容を取得する方法について質問します。具体的には、指定したclassのinnerTextだけを取得したいです。
  • LWPを使用して特定のWebページの情報を取得する際、特定のclassに属する要素の値のみを取得したいです。具体的には、classがbbbである要素の値のみを取得したいです。
  • LWPを使用して取得したWebページの中から、特定のclassに属する要素の値のみを取得する方法について教えてください。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#2のプログラムだと、リンクのあるLI のクラスをccc にしても、同じ結果がでる(LIの終わりを判定していないから)ので、さすがにあんまりだと思って、判定をするようにしてみました。 ---------------------------------------------------------------- use HTML::TokeParser; @a=(); $data = <<DATA; <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> <UL> <LI class=bbb><img alt="xyz"><a href="yyysite1">yyy1</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite2">yyy2</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite3">yyy3</a></LI> </UL> </BODY> DATA $parser = HTML::TokeParser->new(\$data); while ($token = $parser->get_tag('li')) { if($token->[1]{'class'} eq 'bbb'){ while($token = $parser->get_tag('a',"/li") ){ last if $token->[0] eq '/li'; #/LI が見つかったらブレイク if($token->[0] eq 'a'){ $text = $parser->get_text('/a'); $href = $token->[1]{'href'}; push @a, "$href\t$text\n"; } } } } print @a;

yn001ster
質問者

お礼

何度も何度も本当にありがとうございます。m(__)m 実は、LIタグの中にAが2つあり、悩んだのですが、 いただいた回答とその工夫を拝借して、おかげさまでかきのようにして解決することができました。 本当にありがとうございます。 -- $parser = HTML::TokeParser->new(\$res->content); while ($token = $parser->get_tag("li")) { if($token->[1]{'class'} eq "site") { while($token = $parser->get_tag("a","/a","/li") ) { last if $token->[0] eq "/a"; last if $token->[0] eq "/li"; if($token->[0] eq "a") { $text = $parser->get_text("/a"); from_to($text, 'euc-jp', 'shiftjis'); $href = $token->[1]{'href'}; $href =~ s/^http.*\&rd=(.*)/$1/eg; $href =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; push @a, "$href\t$text\n"; } } } } print @a;

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

とりあえず、#2の場合はうまくと思いますが、 よく考えたら、#2の回答は手抜き過ぎで一般的な状況ではうまくいかないような気がします。(<なんだそれ、"どうしてベストを尽くさないのか?") ご注意まで・

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>yyysite1 とyyy1 が欲しいのですが、どのようにすればよいのでしょうか? 同じことですが、、 書き直してみました。 ---------------------------------------------------------------- use HTML::TokeParser; @a=(); $data = <<DATA; <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> <UL> <LI class=bbb><img alt="xyz"><a href="yyysite1">yyy1</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite2">yyy2</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite3">yyy3</a></LI> </UL> </BODY> DATA $parser = HTML::TokeParser->new(\$data); while ($token = $parser->get_tag('li')) { if($token->[1]{'class'} eq 'bbb'){ # LI class="bbb" while($token = $parser->get_tag('a') ){ $href = $token->[1]{'href'}; $text = $parser->get_text('/a'); push @a, "$href\t$text\n"; } } } print @a;

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

そのような場合にはHTMLパーサーを使います。 CPANモジュールに HTML::TokeParser というモジュールがありますが、それを使った場合のサンプル ---------------------------------------------------------------- use HTML::TokeParser; @LI_text=(); #$data には、要するにゲットしたHTML文字列 $data = <<DATA; <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> </BODY> DATA $parser = HTML::TokeParser->new(\$data); while ($token = $parser->get_tag('li')) { my $text = $parser->get_text('/li'); push(@LI_text, "$text\n") if $token->[1]{'class'} eq 'bbb'; } print @LI_text;

yn001ster
質問者

お礼

ありがとうございます! 一発で解決です! ところで、質問の仕方が悪かったのですが、本当は <UL> <LI class=bbb><img alt="xyz"><a href="yyysite1">yyy1</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite2">yyy2</a></LI> <LI class=bbb><img alt="xyz"><a href="yyysite3">yyy3</a></LI> </UL> のようにLIに複数のタグが入れ子になっています。 教えていただいた方法だと、 bbb yyy1 のように表示されてしまいました。 本来であれば yyysite1 と yyy1 が欲しいのですが、どのようにすればよいのでしょうか? http://homepage3.nifty.com/hippo2000/perltips/html/TokeParser.htm を見て、一度、LIタグの間の文字列をすべて取り出してからAタグの要素を処理しようとしたのですが、うまくいきませんでした。 よろしければ教えていただけないでしょうか? よろしくお願い致します。m(__)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • LWPで応答データを取得できない

    お世話になります。 perl5でLWPを使用しているのですが、一部のサイトでデータを取得できず困っております。 具体的には my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); my $req = HTTP::Request->new(GET => "http://misshiki.blog7.fc2.com/?xml"); my $res = $ua->request($req); my $buf = $res->content; といった感じでRSSを取得したいのですが、$bufが空になってしまいます。 しかし、 $res->as_string とすると、レスポンスヘッダも含めてRSSが取得できていることが確認できます。 また、上記以外のURLでは正常に$res->contentでデータを取得することができています。 どうもFC2ブログのRSSのみの事象のようではあるのですが、対処方法がわからず困っております。 対策をご教授いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • LWPでヘッダー情報をあらかじめ取得したい

    例えば、下記のようなスクリプトの場合、一度画像が保存された後、ファイルサイズをを抜き出すようになります。 ダウンロード前に、ファイルサイズをあらかじめ知りたいのですがどのようにしたら良いでしょうか? use strict; my $url = "http://img.www.goo.ne.jp/img/gh_logo.png"; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request; use HTTP::Headers; my $req = HTTP::Request->new(GET => $url); my $ua = LWP::UserAgent->new; $ua->agent( 'Mozilla/5.0 (Windows NT 6.0; rv:12.0)' ); $ua->timeout('10'); $ua->max_redirect(); $ua->cookie_jar( HTTP::Cookies->new( file => '', autosave => 1, )); my $res = $ua->request($req, "save.png"); my $file_size = $res->header("content-length"); print $file_size;

    • ベストアンサー
    • Perl
  • LWPモジュールでログインしHTML取得

    use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $url = 'https://toto.netbk.co.jp/main/smm0100'; my %formdata = ('userName' => 'ID', 'loginPwdSet' => 'Pass'); my $request = POST($url,[%formdata]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); $ua->ssl_opts(verify_hostname => 0); my $res = $ua->request($request); print $res->as_string; サポートされないブラウザーで弾かれます 解決策、教えてください

  • Perl LWPでproxyがうまく刺さらない

    Perl初心者です。 LWPでどうしてもproxyが通りません・・・。 何が悪いのかわかりません。教えてください。 モジュールは全て導入を確認しました。 よろしくお願いします。 稚拙なミスだったらごめんなさい。 use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new( timeout=>"5" ); #cybersyndromeさんからLWP::Simpleでproxyを取得 $_ = get('http://www.cybersyndrome.net/pla5.html'); #proxyをリストに代入 (@proxy_list)=/\"\>(.*?)\<\/a\>\<\/li\>\<li\>/g; #適当なサイトをリクエストのターゲットに $r = new HTTP::Request GET,('http://taruo.net/e/'); #前述のターゲットへリクエストしてひとつづつproxyが通るか確かめたいのに何故かすべてすぐにERRORに for($i = 0;$i <= 10;$i++){ $proxy = 'http://'.$proxy_list[$i]; $ua->proxy ([qw(http https)] , $proxy); $req = $ua->request($r); if ($req->is_success) { print "Success!\n"; }else{ print "Error\n"; } }

    • ベストアンサー
    • Perl
  • LWPでHTTPSサイトからコンテンツ取得

    LWP::UserAgentを使用してHTTPSサイトから、 コンテンツを取得して解析処理をしたいのですが、 取得できなくて困っています。 Crypt::SSLeayやopensslを入れてアクセスは出来るようになったのですが、 HTTPサイトの場合 $ua = LWP::UserAgent->new; my $Req = HTTP::Request->new('GET', 'http://~'); my $Res = $ua->request($Req); my $content = $Res->content; これで、コンテンツのソースを取得できたのですが、 同じ用にhttpsサイトから取得しようしても 「<HTML></HTML>」だけしか取得できませんでした。 ちなみに my $content = $Res->as_string; としてみると、 HTTP/1.0 200 OK Content-Type: text/html Client-Date: Thu, 08 Dec 2005 08:01:10 GMT Client-Peer: *.*.*.*:8080 ←隠させてもらいます Client-Response-Num: 1 Refresh: 0; URL=https://~ という取得したいHTTPSサイトにジャンプするような 内容が取得できました。 どうにかしてコンテンツ内容を取得したいのですが、 そもそもHTTPSのコンテンツ内容を取得すること自体 出来ないのでしょうか? その場合代案等もありましたら、教えてください。 とても困っています。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • LWPで意図したhtmlがダウンロード出来ない

    LWPライブラリを使ってhtmlソースをダウンロードし たいのですが、指定したURLを、ブラウザを使って閲 覧できる内容と、異なるhtmlソースがLWPでは取得さ れてしまい、困っています。 具体的にはSGD(http://www.yeastgenome.org)内の (http://db.yeastgenome.org/cgi-bin/SGD/locus.pl? locus=ACE2)で表示される内容の、htmlソースが欲し いのですが、何故かlocus.plスクリプト自体がダウ ンロードされてしまいます。IEなどで[名前をつけて 保存]した場合には、希望のhtmlソースが得られるの ですが... ソースコードは以下の通りです。 use strict; use LWP::UserAgent; &get_entry("ACE2.html"); sub get_entry { my($outfile_name) = @_; my $ua = new LWP::UserAgent; $ua->agent("AgentName/0.1 " . $ua->agent); my $req = new HTTP::Request POST => 'http://db.yeastgenome.org/cgi-bin/SGD/locus.pl?locus=ACE2'; $req->content_type('application/x-www-form-urlencoded'); $req->content('started=1&match=www&errors=0&searchstring=CLN3'); my $res = $ua->request($req); unless($res->is_success) { die "Bad luck this time : "; } open(F, "> ".$outfile_name) || die "file open error :"; print F $res->content; close(F); $res->content; }

    • ベストアンサー
    • Perl
  • LWPでPOST送信した後に送信先に移動したい

    LWPで別サーバーのtest.cgiに以下のようなコードで POST送信しています。 use HTTP::Request::Common; use LWP::UserAgent; $query="param1=dummy"; $ua = LWP::UserAgent->new(); $req = HTTP::Request->new(POST => "http://xxx.xxx.xxx/test.cgi"); $req -> content_type('application/x-www-form-urlencoded'); $req -> content($query); $res = $ua->request($req); $success = $res -> is_success; if(!$success){ die("error"); } $con = $res -> content; この場合、$conにtest.cgiの出力が入るだけで、 URLのhttp://xxx.xxx.xxx/test.cgiに遷移することはできません。 HTMLのformタグでPOST送信したときのように、 POSTでデータを送信してかつ、その送信先に移動するということはできるのでしょうか。 LWPでなくてもいいです。 要するにHTMLのformタグでのPOST送信を手動ではなく、自動で行いたいわけですが、 <form action="http://xxx.xxx.xxx/test.cgi" method="post"> <input type="hidden" name="param1" value="dummy"> </form> このようなタグのあるHTMLを表示して、 JavaScriptでonLoadでsubmitすればできるのですが、 JavaScriptを使っているとSSLの場合にセキュリティのアラートがでる場合があるので、 できればPerlだけでできないかと思ったのです。

  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • LWPでtimeoutがうまくいかない

    LWPを使って外部と通信するプログラムを書きました。 通常時は希望通り動くのですが、相手のサーバが落ちている場合に エラーが戻るまで数分かかります。 ->timeoutの設定も入れたのですがききません。 URL先が落ちているときに、すばやくエラーが戻るようにしたいのですが、 どうしたらよいでしょうか? $server = "http://www.test.com"; $query{testid}="10"; $ua = new LWP::UserAgent; $ua->timeout(10); $request = POST($server, [%query]); $res = $ua->request($request); if (!$res->is_success) { print "Error\n"; exit 1; }

  • Perl HTMLソースから特定のタグ抽出

    use LWP::UserAgent; use HTTP::Request; use HTTP::Response; our $URL = 'https://www.yahoo.co.jp/'; # アクセスする URL my $proxy = new LWP::UserAgent; $proxy->agent('your own created browser name here'); # 任意 $proxy->timeout(60); # 任意 my $req = HTTP::Request->new('GET' => $URL); my $res = $proxy->request($req); my $content = $res->content; print "Content-Type: text/html\n\n"; # HTML ヘッダ (CGI として動作できる) if($res->is_success) { print $content; } else { print 'HTTP エラーコード: ' . $res->code; } これで、HTMLソース全てを取得することはできましたが、 例えば、このソースはヤフーのコードを取得していますが、 ヤフーのコード内で<li></li> リストタグないの文字列がほしいのですが、 どのように抽出すればいいのでしょうか? ヤフーでは、下記のようになっていて <li><a hrf="???????????????">ここの文字列<span>写真</span><span>new</span></li> このソースからここの文字列を抽出させたいです。 さらに、1番目の<li>内、4番目の<li>内といったことも実行したいです。 どうかご教示お願い致します。