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

締切り済みの質問

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>内といったことも実行したいです。

どうかご教示お願い致します。

投稿日時 - 2017-09-21 13:04:01

QNo.9377057

困ってます

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

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

回答(2)

ANo.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;

投稿日時 - 2017-09-21 23:22:33

お礼

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

投稿日時 - 2017-09-22 14:54:46

ANo.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;
}
}

投稿日時 - 2017-09-21 22:29:24

お礼

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

投稿日時 - 2017-09-22 14:54:30