WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:他人のサイトの「title」を取得したい

0:[投稿] CYD [2005/03/06 10:27 ][環境:Mac IE5 Safari Camino Apache]

掲示板用の入力フォームがあって、その中にURLを入力する
input窓があるとします。
そこにURLが入力されてsubmitすると、CGIがそのURLのファイルを
構文解析して<title>を取得し、

print "<a href='URL'>タイトル</a>";

のように出力するようにしたいです。
サーバにはHTML-Parserが入っているようなのですが、使い方が
いまいち判りません。
↓のページを参考にしていろいろ試したのですが、うまくいきません。
HTML::Parser - HTML パーサー・クラス
http://homepage3.nifty.com/hippo2000/perltips/html/Parser.htm

お知恵をお貸しください。
よろしくお願いします。


1:[回答] andi [2005/03/06 13:31 ]

相手サイトのHTMLソース取得まではできているのですか?
あとはタイトルが欲しいだけならパースするまでもなく、
<title></title>の間を正規表現で抜けば良いと思いますよ。


2:[回答] sim [2005/03/06 13:54 ]

HTTPソケット系のモジュールを探したほうがいい気がします。

HTML-Parserというモジュールを知らず、さっと目を通しただけなのですが、恐らくローカル内でしか動かないのではないでしょうか?
-------------------------------------------------------
$host = "入力されたURLのホスト";
$path = "入力されたURLのPATH";

$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET $path HTTP/1.0\r\n\r\n";
while (<S>) { $chunk1 .= $_; }
close(S);

$p->parse($chunk1);
-------------------------------------------------------

おおよそこんな感じじゃないでしょうか。
うごかなそうですけど。
ちなみにHTML::Parserの利用方法はそちらのページを参照してください。

HTML::Parserは使わず、
if($chunk1 =~ m/<title>(.*)<\/title>/){
 $title = $1;
}
こんなんで良い気がしますけど。

ちなみに下記を作ってみました。
多分同じ動きをします。
-----------------------------------------------------
#!C:/perl/bin/perl

    print "Content-type: text/plain\n\n";
    $site = &GetTitle("http://www.yahoo.co.jp/d.html");
    print "$site";


sub GetTitle{
    $url = shift;

    @parse = split(/\//,$url);

    $host = $parse[2];
    $path = "/".join("/",splice(@parse,3));

    $addr = (gethostbyname($host))[4];
    socket(SOCK,2,1,0);
    connect(SOCK,pack("Sna4x8",2,80,$addr));
    binmode(SOCK);
    select(SOCK);
    $| = 1;
    select(STDOUT);
    print SOCK "GET $path HTTP/1.0\r\n\r\n";
    while(<SOCK>){$chunk1 .= $_;}
    close(SOCK);

    if($chunk1 =~ m/<title>(.*)<\/title>/){
        $title = $1;
        return $title;
    }
}
-----------------------------------------------------


3:[回答] sim [2005/03/06 14:03 ]

すいません。補足です。

掲示板の投稿

で利用するのであれば入力されたURLがHTMLファイルであることを
前提にした方がいいかも知れません。

また、$titleを受け取ったあとで、< や = などの危なそうな文字を置換するとかは必ず行ってください。


4:[保留] CYD [2005/03/08 10:55 ]

andiさま、ありがとうございます。
HTMLから取れていない状態です。
パースさえできればあとは自分のスキルでもなんとかできると思うのですが…。


simさま、わざわざスクリプトを書いていただきましてありがとうございます。

サーバはsakuraインターネットを使ってまして、「HTML-Parser-3.36」というのは
sakuraの中の会員メニューで示されるモジュール一覧での表記です。
私はこれをHTML::Parserモジュールのことだと思っているのですが、それが間違い
の元でうまくいかないのかもしれません。

で、お教えいただいた方法ですが、前者は動きませんでした。
後者のほうはルートディレクトリ直下のファイルには有効ですが、ディープリンク
では値を返してもらえないです。
しかも、ルートディレクトリ直下のファイルでも、たとえば自分のようにsakuraで
サーバを借りて独自ドメインを利用している場合は「さくらのインターネット」と
いうのが返ってきてしまいます。
IPアドレスからじゃないとパースはできないものでしょうか。


5:[回答] ミツ [2005/03/08 15:23 ]

HTML-Parser-3.36 は HTML::Parserモジュールで合っていると思います。
ただ、他の方も言われているようにHTML::Parserを使うほどの事でもないと思います。

htmlファイルの取得に関しては最近のサーバならLWPモジュールが使えると思うので
http://www.phoenix-c.or.jp/~zspc/cgi-bin/wwwlng.cgi?print+2000-10/00100083.txt
ここに投稿されているソースを試してみては?


6:[回答] ミツ [2005/03/08 15:33 ]

補足・・・勘違いされてるっぽいので。

>HTMLから取れていない状態です。
>パースさえできればあとは自分のスキルでもなんとかできると思うのですが…。

まず、HTMLの取得ができなければパースもできません。
HTML::Parserは文字列(html)を解析(パース)するだけで、URLを指定してHTMLを取得するような事はしてくれません。


7:[完了] CYD [2005/03/08 17:30 ]

ミツさま、ありがとうございます。
お教えいただいたページの方法でうまくいきました。
sakuraには書いてありませんが、LWPモジュールもちゃんと入っているようです。
そういえばトラックバックPingのオートディスカバリーでLWPモジュールを使うというようなことを
どこかで見聞きした記憶があります。
よくよく考えれば同じ原理ですね。


> まず、HTMLの取得ができなければパースもできません。

自分はてっきりHTML::Parserを使えば、ヘッダ情報だけとかをサックリ取得できるものと思ってました。
勉強になります。

みなさま、ありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World