HTML::TreeBuilderとは?インストール方法と使い方

このQ&Aのポイント
  • Perlで特定のHTMLタグの情報を抜き出すために使われるモジュールであるHTML::TreeBuilderについて説明します。
  • HTML::TreeBuilderは、HTMLをパースしてツリー構造に変換することができるモジュールです。
  • このモジュールを使うことで、HTMLの要素や属性に簡単にアクセスすることができます。また、ツリー構造を操作することで、必要な情報を抽出することも可能です。
回答を見る
  • ベストアンサー

HTML::TreeBuilderについてです

perlで特定のhtmlタグの情報を抜き出そうとしてHTML::TreeBuilderを使おうとしているのですが、インストールして実行してもlook_downメソッドがないといわれます。 しっかりとインストールはしているのであるはずなのですが・・・ どうすればよいか皆目見当もつかないのでどうぞよろしくお願いします。 ちなみにコードは以下の通りです↓ use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; use HTML::Element; use Encode; # urlを指定する my $url = 'http://www.nikkansports.com/'; # IE8のフリをする my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; # LWPを使ってサイトにアクセスし、HTMLの内容を取得する my $ua = LWP::UserAgent->new; my $res = $ua->get($url); my $content = $res->content; # HTML::TreeBuilderで解析する my $tree = HTML::TreeBuilder->new; $tree->parse($content); $tree = decode("UTF-8",$tree); $tree = encode("Shift_JIS",$tree); # DOM操作してトピックの部分だけ抜き出す。 # <div id='topicsfb'><ul><li>....の部分を抽出する my @items = $tree->look_down('id', 'sideRanking')->find('li'); print $_->as_text."\n" for @items;

  • Perl
  • 回答数1
  • ありがとう数9

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

> my $tree = HTML::TreeBuilder->new; > $tree->parse($content); > $tree = decode("UTF-8",$tree); > $tree = encode("Shift_JIS",$tree); > ... > my @items = $tree->look_down('id', 'sideRanking')->find('li'); $tree に decode と encode の戻り値を代入している部分は誤りです。decode と encode は文字列を返すので、$tree はオブジェクトではなく通常の文字列を格納する変数になってしまいます。 なお、HTML::TreeBuilde を始めとした質問に書かれているモジュールをあまり使ったことがないので明快な解答を示すことができませんが、文字コードの変換を最後に移したらどうでしょうか。 print encode("Shift_JIS", decode("UTF-8", $_->as_text)), "\n" for @items;

関連するQ&A

  • 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 HTML::TreeBuilder返り値

    perl、HTML::TreeBuilderモジュールを使ってHTMLからほしい情報を抽出しています。 探したタグがない場合に、次の処理にいけるように判定したいのですが、うまくいきません。 以下抽出部分のソースです。 my $tree = HTML::TreeBuilder->new; $tree->parse($html); my $items = $tree->look_down('class', 'referencelink')->find('li'); $items = $items->as_text;   HTML内に<li class="referencelink">というタグがない場合 $items にどんな値が入るのでしょうか。 if (!defined($items)) や if ($items=="")で判定しても、 my $items = $tree->look_down('class', 'referencelink')->find('li'); で処理が止まってしまいます。 どうしたらよいでしょうか? よろしくお願いいたします。

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

  • 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?] 特定の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
  • テキストの自動収集について

    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で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
  • UTF-8で書かれたHTMLファイルをShift-JISのファイルに変換できない

    #!/usr/bin/perl -w =begin comment OS: Windows XP Perl: Active Perl v5.8.8 スクリプトは「Shift-JIS」で書いています。 日本語処理関係で参考にしているのはもっぱらオライリージャパンの「Spidering Hacks」の付録の翻訳者 による日本語処理の解説です。 http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、use encoding 'shiftjis'; から use encoding 'cp932'; へ変更している以外は そこに書かれているやり方に従っていると思います。 UTF-8で書かれたHTMLファイルを「LWP::UserAgent」で取得し、それを Shift-JISコードで出力したいと思い以下のコードを実行したのですが、 以下のエラーが出てしまいました。 Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/usr/local/site/lib/LWP/Protocol.pm line 114. このエラーは何が原因なのでしょうか? =end comment =cut use strict; use LWP 5.64; use Encode; use encoding 'cp932'; # http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、'shiftjis'から'cp932'へ変更。 #use encoding 'shiftjis'; binmode(STDERR, ':raw :encoding(shiftjis)'); my $url = "http://www.audiounion.jp/bin/products/used/A0/-/-/"; my $browser = LWP::UserAgent->new; my $response = $browser->get( $url ); die "cannot get $url:", $response->status_line unless $response->is_success; my $content = Encode::decode('utf8', $response->content); print $content;

  • JSON形式のデータ解析が出来なくて悩んでます。

    「Twitterから学ぶ,Web APIのキホン」(http://gihyo.jp/dev/serial/01/perl-hackers-hub/000403)のサンプルプログラムを参考にitunesの検索apiの検索結果を解析しようとしているのですが解析できなく、何も表示されない状態になります。 itunes 検索api http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html まずは上のSearch Examplesにいくつか示しているitunes apiの検索結果(jsonデータ)から"artistId"に対する項目や"artistName"に対する項目を抜き出そうと試みています。 以下は実際に私が実行しているプログラムです。 ----------------------------------------------------------------- print <<"HTML"; Content-type: text/html <html> HTML use LWP::UserAgent; use URI; use JSON qw(decode_json); use Encode qw(encode_utf8); my $uri = URI->new('※ここにitunes apiの検索結果のurl入れています'); my $ua = LWP::UserAgent->new; my $res = $ua->get($uri); my $json = $res->content; my $ref = decode_json($json); for my $applist ( @{ $ref->{results} } ) { print encode_utf8("$applist->{artistId}: $applist->{artistName}\n");} -------------------------------------------------------------------------------------- としているのですが結果は何も表示されません。※cgiはmac 環境にてUTF-8 Mac(CR)で保存しております。 「Twitterから学ぶ,Web APIのキホン」のサンプルプログラムは正常に動いて表示出来ているのでモジュールやPerlのパスには問題ないと思います。 どうすればitunes 検索apiのjsonデータがPerlでちゃんと解析されるのかご教示お願いします。

    • ベストアンサー
    • Perl
  • 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;

専門家に質問してみよう