• 締切済み

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>内といったことも実行したいです。 どうかご教示お願い致します。

  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.2

yahooインデックス見たけど <a>タグは</a>タグで閉じられてる タグを抜き出すのか文字列なのかわからない 解答になってるのかもかわからないから参考に open KK,'yahoo.txt'; my $counter = 0; my $search = 4; # 4番目 while(<KK>){ if($_ =~ m[^<li.+>(.+)</a>]){ if($search){ $counter++; if($counter == $search){ print"$1\n"; } }else{ print"$1\n";} } } close KK;

perlhogehoge
質問者

お礼

ありがとうございます! 解決しました

  • hok212
  • ベストアンサー率66% (100/150)
回答No.1

基本形は次のような形式になると思います。 元ソースの次の部分を if($res->is_success) { print $content; } 次のように書き換えます。 if($res->is_success) { @lines = split(/\n/,$content); #ソース全部を改行コードで区切り配列に入れる foreach (@lines) { $_ =~ s/<li>(\w+)<li>/$1/i; # liタグの内側の文字列を取得 $line = $1; $line =~ s/<span>\w+</span>//ig; # spanタグおよび内側の文字列を消去 $line =~ s/<.*?>//g; #残りのタグを除去 print $line; } }

perlhogehoge
質問者

お礼

ありがとうございます! 解決しました

関連するQ&A

  • 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
  • web文書を取得するプログラムのサイト内での不具合について

    perl初心者です。 自分のwebサイトのコードを取得するプログラムをつくろう と思っているのですが、下のコード -------------------------------------------------------- #!/usr/local/bin/perl use LWP::UserAgent; use HTTP::Request; use HTTP::Response; our $URL = 'http://www.google.co.jp/'; # アクセスする URL my $proxy = new LWP::UserAgent; my $req = HTTP::Request->new('POST' => $URL); # HTTP リクエストを作成 my $res = $proxy->request($req); # $res に HTTP レスポンスが返ってくる print $res->content; # HTML を表示 1; --------------------------------------------------------------- でターゲットのurlが上のgoogleだと取得できるんですが 自サイトのurl'http://○○.××.△△.com/'だと 500 Internal Server Errorとなってしまいます。 因みにレンタルサーバーを利用しています。 サーバーでは技術的な質問は受け付けてないとの事なので、 スクリプトの質問とは少しズレますが分る方がいましたら ご教えていただきたく質問いたしました。

  • 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?] 特定のCLASSの値だけ取得したい

    LWPを使って、特定のWebページを取得しました。 -- use LWP::UserAgent; $ua = LWP::UserAgent->new; $ua->agent("$0/0.1 " . $ua->agent); $req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/'); $req->header('Accept' => 'text/html'); # リクエストの送信 $res = $ua->request($req); # 出力のチェック if ($res->is_success) { print $res->content; #←ここが取得したあいたいです。 } else { print "Error: " . $res->status_line . "\n"; } -- この中から指定したclassのinnerTextだけ取得したいのですがどのようにしたらよいのでしょうか? 要は$res->contentに -- <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> -- のような値が入っていてclass=bbbの「yyy1」~「yyy3」だけ取得したいのですが。 よろしくお願い致します。 (参考)LWP http://homepage3.nifty.com/hippo2000/perltips/LWP.html

    • ベストアンサー
    • 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
  • Perlのコードを隠蔽する

    Perlのソースコードを隠蔽する&ActivePerlなどがない環境でも動くようにperl2exeを使って変換して配布しようと思っています。 逆コンパイラされる可能性が0ではないことはわかっています。 しかし、下記コードの実行がなかなかうまくいきません。実際の.plでの起動時ではうまくいくのですが、.exeに変換するとうまくいかないようです。回避方法を教えてください。 -------------------- use HTTP::Request::Common qw(POST); use LWP::UserAgent; my $ua = LWP::UserAgent->new; my %loginform = ('mail' => 'hogehoge@hoge.jp', 'password' => 'hogehoge'); my $request = POST('https://****/login', [%loginform]); my $res = $ua->request($request); my $cookie = $res->header('Set-Cookie'); --------------------

  • テキストの自動収集について

    perl言語を使用してokwaveのカテゴリごとにテキストを収集しています。 カテゴリ「ビジネス」内のテキストは以下のコードで収集していました。 use Encode::Guess; use LWP::UserAgent; use HTTP::Request; use Encode; open(OUT, ">>java.csv"); for (my $i=20; $i<200; $i+=20){ our $url = "http://okwave.jp/205/221/c253_$i.html"; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); my $content = $res->content; while ($content =~ m/<a href=\"\.\.\/(qa[0-9]+\.html)\">/g){ my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => 'http://okwave.jp/'.$1); my $res = $ua->request($req); my $content = $res->content; @qa1 = (); @qa2 = (); for (my $i=0; $i<2; $i++){ $content =~ m!<span class=\"_LSUCS\">(.*?)</span>!sg; #Q&AタイトルとQ本文 $a = $1; $a =~ s/\r\n//g; $a =~ s/<br \/>//g; $a =~ s/,//g; push (@qa1,$a); } while ($content =~ m!rowspan(.*?)</span>.*?どんな人:(.*?)<br/>!sg){ $b = $1; $c = $2; $b =~ s/(=\"3\".*?LSUCS\">)//sg; $b =~ s/\r\n//g; $b =~ s/<br \/>//g; $b =~ s/,//g; push @qa2,$b; push @qa2,$c; } $qa1 = join ',',@qa1; $qa2 = join ',',@qa2; $qa = "$qa1,$qa2\n"; print OUT $qa; } } close OUT; カテゴリ「プログラム」内のテキストを収集する際抽出カテゴリの アドレス部分のみ「プログラム」のurlに書き換えたところ csvファイルが0kbのままでテキストを収集することができません。 よろしくお願いします。

    • ベストアンサー
    • 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; サポートされないブラウザーで弾かれます 解決策、教えてください

  • CGIの接続エラー

    PerlのLWP::UserAgentを使った接続で,エラーが生じてしまいます. ローカルからなら期待通りにページ内容を取得できるのですが,サーバに配置してブラウザからアクセスするとInternal Server Errorとなります. プロキシは使っていません.ファイアウォールやセキュリティソフトを切ってもエラーが生じてしまいます. 対象URL(下のコードではhttp://wikipedia.simpleapi.net/api?keyword=YouTube&output=xml)を変えても同じ結果になります. 理由がわかる方がいらっしゃればご教授願います. CGIにPerl5,サーバにApache Tomcat 5.5を利用しています. エラー内容とコードは下のようになっています. エラー内容 「500 Can't connect to wikipedia.simpleapi.net:80 (Bad hostname 'wikipedia.simpleapi.net')」 コード #!/usr/local/bin/perl use LWP::UserAgent; print "Content-type: text/plain\n\n"; my $ua = LWP::UserAgent->new; $ua->agent("Mozilla/5.0"); my $req = HTTP::Request->new(GET => "http://wikipedia.simpleapi.net/api?keyword=YouTube&output=xml"); my $res = $ua->request($req); $res = $ua->request($req); my $content = $res->content; print $content; exit;

  • 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

専門家に質問してみよう