このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/php/1147830986/9 
#  1.1行ずつURLが記述されたテキストファイルを読み込み、 
#  2.そのURLのコンテンツを取得して 
#  3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) 
#  するプログラムを作ってください。 
#   
#  尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。 
#  (リンク先が存在し、そこには必ず<title></title>で囲まれた箇所があるhtml) 
#  また正常系のみで、エラー(テキストファイルが読み込めない、ネットワークが 
#  繋がらなくてコンテンツが取得できない)の場合の処理は無くて構わない。 
#   
#  1〜3まで順を追ってやっていくと良いよ。 
#  1がファイルの扱い、ループ処理や配列の扱い(逐次処理でやれば配列使わないけど)、 
#  2がネット(HTTP)関連、3が文字列処理や正規表現あたり。 
#   

'1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_テキストファイル) :-
        get_lines(_テキストファイル,Lines),
        member(URL,Lines),
        'URLをHost,Port,Fileに分解する'(URL,Host,Port,File),
        www_lines(Host,Port,File,_行ならび),
        文字コードを得る(_行ならび,_文字コード),
        タイトルを得る(_行ならび,_文字コード,_タイトル),
        write_formatted('URL=%t タイトル=%t\n',[URL,_タイトル]),
        fail.
'1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_).

'URLをHost,Port,Fileに分解する'(URL,Host,Port,File) :-
        'sPLIT'(URL,['/',':'],[http,':','/','/',Host,':',Port,'/'|File]),!.
'URLをHost,Port,Fileに分解する'(URL,Host,80,File) :-
        'sPLIT'(URL,['/',':'],[http,':','/','/',Host,'/'|File]),!.

文字コードを得る(_行ならび,_文字コード) :-
        append(_,[''|R],_行ならび),
        append(_,[_行|R1],R),
        sub_atom(_行,_,8,_,P,'char_set',_残り文字列,_,_,_),
        split(_残り文字列,['=',' ',',','>'],[A|_]),
        to_upper(A,B),
        文字コード(A,_文字コード).        

タイトルを得る(_行ならび,euc,_タイトル) :-
        append(_,[''|R],_行ならび),
        append(_,[_行|R1],R),
        sub_atom(_行,_,7,_,_,'',_残り文字列,_,_,_),
        sub_atom(_残り文字列,_,8,_,_エンコードされたタイトル,'',_,_,_,_),
        URLの文字列をデコードする(_エンコードされたタイトル,_タイトル),!.

文字コード('EUC_JP',euc) :- !.
文字コード('EUC-JP',euc) :- !.
文字コード('SJIS_JP',sjis) :- !.
文字コード('SJIS-JP',sjis) :- !.

www_lines(Host, Port, File, DataList) :-
        hp_open_client(Host, Port, Socket),
        make_request_header(Host,Header),
        hp_work_client(Socket,Header,DataList).

hp_open_client(Host, Service, Socket) :-
        atom(Service), !,
        net_service(Service, tcp, Port),
        socket(internet, stream, Socket),
        host_addr(Host, Addr),
        socket_connect(Socket, Addr : Port).

hp_open_client(Host, Port, Socket) :-
        integer(Port), !,
        socket(internet, stream, Socket),
        socket_connect(Socket, Host : Port).

make_request_header(_ファイル,Header) :-
        myhostname(Myhostname),
        request_header_file(_ファイル,_整形されたファイル),
        concat_atom(['GET ',_ファイル,' HTTP/1.1\nHost: ',Myhostname,
                '\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.8) Gecko/20050511\n',
                'Accept: text/xml,application/xml,application/xhtml+xml,',
                'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: ja,',
                'en-us;q=0.7,en;q=0.3\nAccept-Encoding: gzip,deflate\n',
                'Accept-Charset: EUC-JP,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\n',
                'Connection: keep-alive\n\n'],Header).

request_header_file(_ファイル,_ファイル) :-
        sub_atom(_ファイル,0,1,_,'/'),!.
request_header_file(_ファイル,_整形されたファイル) :-
        \+(sub_atom(_ファイル,0,1,_,'/')),
        concat_atom(['/',_ファイル],_整形されたファイル),!.

hp_work_client(Socket,Header,DataList) :-
        open(Socket, read, Input),
        open(Socket, write, Output),
        write_formatted(Output,'%t',[Header]),
        flush_output,
        findall(X,(repeat,get_line(Input,_診断,Data),(_診断=終了,!,fail;true)),DataList),
        close(Input),
        close(Output),
        socket_shutdown(Socket).